diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index 9e5ea6a..ff02eb2 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -26,7 +26,6 @@ jobs: - name: Setup Environment run: | - rm composer.lock npm run setup - name: Test diff --git a/composer.json b/composer.json index aa09726..e14c39b 100644 --- a/composer.json +++ b/composer.json @@ -19,10 +19,16 @@ "support" : { "issues": "https://github.com/WordPress/phpdoc-parser/issues" }, + "repositories": [ + { + "type": "path", + "url": "./vendor-packages/phpdocumentor-reflection" + } + ], "require" : { - "php" : ">=5.4", + "php" : ">=7.4", "composer/installers" : "~1.0", - "phpdocumentor/reflection" : "~3.0", + "phpdocumentor/reflection" : "dev-main", "erusev/parsedown" : "~1.7", "scribu/lib-posts-to-posts": "dev-master@dev", "scribu/scb-framework" : "dev-master@dev", @@ -47,6 +53,9 @@ "composer/installers": true }, "_process-timeout-comment": "Work around `test:watch` timeout, see https://github.com/spatie/phpunit-watcher/issues/63#issuecomment-545633709", - "process-timeout": 0 + "process-timeout": 0, + "audit": { + "block-insecure": false + } } } diff --git a/composer.lock b/composer.lock index 55aea9d..9ce4be7 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "96d200642f6aded313abd6eb270909ee", + "content-hash": "f897d027545bb5e330e6fc3f18faa8aa", "packages": [ { "name": "composer/installers", @@ -209,32 +209,38 @@ }, { "name": "nikic/php-parser", - "version": "v1.4.1", + "version": "v3.1.5", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51" + "reference": "bb87e28e7d7b8d9a7fda231d37457c9210faf6ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51", - "reference": "f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/bb87e28e7d7b8d9a7fda231d37457c9210faf6ce", + "reference": "bb87e28e7d7b8d9a7fda231d37457c9210faf6ce", "shasum": "" }, "require": { "ext-tokenizer": "*", - "php": ">=5.3" + "php": ">=5.5" }, + "require-dev": { + "phpunit/phpunit": "~4.0|~5.0" + }, + "bin": [ + "bin/php-parse" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4-dev" + "dev-master": "3.0-dev" } }, "autoload": { - "files": [ - "lib/bootstrap.php" - ] + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -252,26 +258,20 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/1.x" + "source": "https://github.com/nikic/PHP-Parser/tree/v3.1.5" }, - "time": "2015-09-19T14:15:08+00:00" + "time": "2018-02-28T20:30:58+00:00" }, { "name": "phpdocumentor/reflection", - "version": "3.0.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/Reflection.git", - "reference": "793bfd92d9a0fc96ae9608fb3e947c3f59fb3a0d" - }, + "version": "dev-main", "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/Reflection/zipball/793bfd92d9a0fc96ae9608fb3e947c3f59fb3a0d", - "reference": "793bfd92d9a0fc96ae9608fb3e947c3f59fb3a0d", - "shasum": "" + "type": "path", + "url": "./vendor-packages/phpdocumentor-reflection", + "reference": "8afce995548887021832810cf966f131eab3501e" }, "require": { - "nikic/php-parser": "^1.0", + "nikic/php-parser": "^3.0", "php": ">=5.3.3", "phpdocumentor/reflection-docblock": "~2.0", "psr/log": "~1.0" @@ -284,7 +284,8 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.0.x-dev", + "dev-wp": "v3.0.2-dmsnell" } }, "autoload": { @@ -296,7 +297,6 @@ ] } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -308,11 +308,9 @@ "reflection", "static analysis" ], - "support": { - "issues": "https://github.com/phpDocumentor/Reflection/issues", - "source": "https://github.com/phpDocumentor/Reflection/tree/master" - }, - "time": "2016-05-21T08:42:32+00:00" + "transport-options": { + "relative": true + } }, { "name": "phpdocumentor/reflection-docblock", @@ -579,25 +577,25 @@ }, { "name": "clue/term-react", - "version": "v1.3.0", + "version": "v1.4.0", "source": { "type": "git", "url": "https://github.com/clue/reactphp-term.git", - "reference": "eb6eb063eda04a714ef89f066586a2c49588f7ca" + "reference": "00f297dc597eaee2ebf98af8f27cca5d21d60fa3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/clue/reactphp-term/zipball/eb6eb063eda04a714ef89f066586a2c49588f7ca", - "reference": "eb6eb063eda04a714ef89f066586a2c49588f7ca", + "url": "https://api.github.com/repos/clue/reactphp-term/zipball/00f297dc597eaee2ebf98af8f27cca5d21d60fa3", + "reference": "00f297dc597eaee2ebf98af8f27cca5d21d60fa3", "shasum": "" }, "require": { "php": ">=5.3", - "react/stream": "^1.0 || ^0.7" + "react/stream": "^1.2" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8", - "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/event-loop": "^1.2" }, "type": "library", "autoload": { @@ -636,7 +634,7 @@ ], "support": { "issues": "https://github.com/clue/reactphp-term/issues", - "source": "https://github.com/clue/reactphp-term/tree/v1.3.0" + "source": "https://github.com/clue/reactphp-term/tree/v1.4.0" }, "funding": [ { @@ -648,20 +646,20 @@ "type": "github" } ], - "time": "2020-11-06T11:50:12+00:00" + "time": "2024-01-30T10:22:09+00:00" }, { "name": "clue/utf8-react", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/clue/reactphp-utf8.git", - "reference": "8bc3f8c874cdf642c8f10f9ae93aadb8cd63da96" + "reference": "d5cd04d39cb5457aa5df830b7c4b301d2694217e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/clue/reactphp-utf8/zipball/8bc3f8c874cdf642c8f10f9ae93aadb8cd63da96", - "reference": "8bc3f8c874cdf642c8f10f9ae93aadb8cd63da96", + "url": "https://api.github.com/repos/clue/reactphp-utf8/zipball/d5cd04d39cb5457aa5df830b7c4b301d2694217e", + "reference": "d5cd04d39cb5457aa5df830b7c4b301d2694217e", "shasum": "" }, "require": { @@ -669,7 +667,7 @@ "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4 || ^0.3" }, "require-dev": { - "phpunit/phpunit": "^9.3 ||^5.7 || ^4.8", + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", "react/stream": "^1.0 || ^0.7" }, "type": "library", @@ -699,7 +697,7 @@ ], "support": { "issues": "https://github.com/clue/reactphp-utf8/issues", - "source": "https://github.com/clue/reactphp-utf8/tree/v1.2.0" + "source": "https://github.com/clue/reactphp-utf8/tree/v1.3.0" }, "funding": [ { @@ -711,34 +709,34 @@ "type": "github" } ], - "time": "2020-11-06T11:48:09+00:00" + "time": "2023-12-06T14:52:17+00:00" }, { "name": "doctrine/instantiator", - "version": "1.4.1", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^9", + "doctrine/coding-standard": "^9 || ^11", "ext-pdo": "*", "ext-phar": "*", "phpbench/phpbench": "^0.16 || ^1", "phpstan/phpstan": "^1.4", "phpstan/phpstan-phpunit": "^1", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.22" + "vimeo/psalm": "^4.30 || ^5.4" }, "type": "library", "autoload": { @@ -765,7 +763,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.1" + "source": "https://github.com/doctrine/instantiator/tree/1.5.0" }, "funding": [ { @@ -781,32 +779,32 @@ "type": "tidelift" } ], - "time": "2022-03-03T08:28:38+00:00" + "time": "2022-12-30T00:15:36+00:00" }, { "name": "evenement/evenement", - "version": "v3.0.1", + "version": "v3.0.2", "source": { "type": "git", "url": "https://github.com/igorw/evenement.git", - "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7" + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/igorw/evenement/zipball/531bfb9d15f8aa57454f5f0285b18bec903b8fb7", - "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", "shasum": "" }, "require": { "php": ">=7.0" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9 || ^6" }, "type": "library", "autoload": { - "psr-0": { - "Evenement": "src" + "psr-4": { + "Evenement\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -826,9 +824,9 @@ ], "support": { "issues": "https://github.com/igorw/evenement/issues", - "source": "https://github.com/igorw/evenement/tree/master" + "source": "https://github.com/igorw/evenement/tree/v3.0.2" }, - "time": "2017-07-23T21:35:13+00:00" + "time": "2023-08-08T05:53:35+00:00" }, { "name": "jolicode/jolinotif", @@ -894,16 +892,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.11.0", + "version": "1.13.4", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", "shasum": "" }, "require": { @@ -911,11 +909,12 @@ }, "conflict": { "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" + "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "require-dev": { "doctrine/collections": "^1.6.8", "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", @@ -941,7 +940,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" }, "funding": [ { @@ -949,7 +948,7 @@ "type": "tidelift" } ], - "time": "2022-03-03T13:19:32+00:00" + "time": "2025-08-01T08:46:24+00:00" }, { "name": "phar-io/manifest", @@ -1197,16 +1196,16 @@ }, { "name": "phpunit/php-file-iterator", - "version": "2.0.5", + "version": "2.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5" + "reference": "69deeb8664f611f156a924154985fbd4911eb36b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5", - "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/69deeb8664f611f156a924154985fbd4911eb36b", + "reference": "69deeb8664f611f156a924154985fbd4911eb36b", "shasum": "" }, "require": { @@ -1245,7 +1244,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.5" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.6" }, "funding": [ { @@ -1253,7 +1252,7 @@ "type": "github" } ], - "time": "2021-12-02T12:42:26+00:00" + "time": "2024-03-01T13:39:50+00:00" }, { "name": "phpunit/php-text-template", @@ -1302,16 +1301,16 @@ }, { "name": "phpunit/php-timer", - "version": "2.1.3", + "version": "2.1.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662" + "reference": "a691211e94ff39a34811abd521c31bd5b305b0bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/2454ae1765516d20c4ffe103d85a58a9a3bd5662", - "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/a691211e94ff39a34811abd521c31bd5b305b0bb", + "reference": "a691211e94ff39a34811abd521c31bd5b305b0bb", "shasum": "" }, "require": { @@ -1349,7 +1348,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.3" + "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.4" }, "funding": [ { @@ -1357,7 +1356,7 @@ "type": "github" } ], - "time": "2020-11-30T08:20:02+00:00" + "time": "2024-03-01T13:42:41+00:00" }, { "name": "phpunit/php-token-stream", @@ -1557,33 +1556,31 @@ }, { "name": "react/event-loop", - "version": "v1.3.0", + "version": "v1.6.0", "source": { "type": "git", "url": "https://github.com/reactphp/event-loop.git", - "reference": "187fb56f46d424afb6ec4ad089269c72eec2e137" + "reference": "ba276bda6083df7e0050fd9b33f66ad7a4ac747a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/event-loop/zipball/187fb56f46d424afb6ec4ad089269c72eec2e137", - "reference": "187fb56f46d424afb6ec4ad089269c72eec2e137", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/ba276bda6083df7e0050fd9b33f66ad7a4ac747a", + "reference": "ba276bda6083df7e0050fd9b33f66ad7a4ac747a", "shasum": "" }, "require": { "php": ">=5.3.0" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, "suggest": { - "ext-event": "~1.0 for ExtEventLoop", - "ext-pcntl": "For signal handling support when using the StreamSelectLoop", - "ext-uv": "* for ExtUvLoop" + "ext-pcntl": "For signal handling support when using the StreamSelectLoop" }, "type": "library", "autoload": { "psr-4": { - "React\\EventLoop\\": "src" + "React\\EventLoop\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1619,32 +1616,28 @@ ], "support": { "issues": "https://github.com/reactphp/event-loop/issues", - "source": "https://github.com/reactphp/event-loop/tree/v1.3.0" + "source": "https://github.com/reactphp/event-loop/tree/v1.6.0" }, "funding": [ { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2022-03-17T11:10:22+00:00" + "time": "2025-11-17T20:46:25+00:00" }, { "name": "react/stream", - "version": "v1.2.0", + "version": "v1.4.0", "source": { "type": "git", "url": "https://github.com/reactphp/stream.git", - "reference": "7a423506ee1903e89f1e08ec5f0ed430ff784ae9" + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/stream/zipball/7a423506ee1903e89f1e08ec5f0ed430ff784ae9", - "reference": "7a423506ee1903e89f1e08ec5f0ed430ff784ae9", + "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", "shasum": "" }, "require": { @@ -1654,12 +1647,12 @@ }, "require-dev": { "clue/stream-filter": "~1.2", - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { "psr-4": { - "React\\Stream\\": "src" + "React\\Stream\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1701,32 +1694,28 @@ ], "support": { "issues": "https://github.com/reactphp/stream/issues", - "source": "https://github.com/reactphp/stream/tree/v1.2.0" + "source": "https://github.com/reactphp/stream/tree/v1.4.0" }, "funding": [ { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2021-07-11T12:37:55+00:00" + "time": "2024-06-11T12:45:25+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.2", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619" + "reference": "92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619", - "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54", + "reference": "92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54", "shasum": "" }, "require": { @@ -1760,7 +1749,7 @@ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "support": { "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.2" + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.3" }, "funding": [ { @@ -1768,20 +1757,20 @@ "type": "github" } ], - "time": "2020-11-30T08:15:22+00:00" + "time": "2024-03-01T13:45:45+00:00" }, { "name": "sebastian/comparator", - "version": "3.0.3", + "version": "3.0.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "1071dfcef776a57013124ff35e1fc41ccd294758" + "reference": "bc7d8ac2fe1cce229bff9b5fd4efe65918a1ff52" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1071dfcef776a57013124ff35e1fc41ccd294758", - "reference": "1071dfcef776a57013124ff35e1fc41ccd294758", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/bc7d8ac2fe1cce229bff9b5fd4efe65918a1ff52", + "reference": "bc7d8ac2fe1cce229bff9b5fd4efe65918a1ff52", "shasum": "" }, "require": { @@ -1834,28 +1823,40 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.3" + "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.7" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" } ], - "time": "2020-11-30T08:04:30+00:00" + "time": "2026-01-24T09:20:25+00:00" }, { "name": "sebastian/diff", - "version": "3.0.3", + "version": "3.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211" + "reference": "98ff311ca519c3aa73ccd3de053bdb377171d7b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/14f72dd46eaf2f2293cbe79c93cc0bc43161a211", - "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/98ff311ca519c3aa73ccd3de053bdb377171d7b6", + "reference": "98ff311ca519c3aa73ccd3de053bdb377171d7b6", "shasum": "" }, "require": { @@ -1900,7 +1901,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/3.0.3" + "source": "https://github.com/sebastianbergmann/diff/tree/3.0.6" }, "funding": [ { @@ -1908,20 +1909,20 @@ "type": "github" } ], - "time": "2020-11-30T07:59:04+00:00" + "time": "2024-03-02T06:16:36+00:00" }, { "name": "sebastian/environment", - "version": "4.2.4", + "version": "4.2.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0" + "reference": "56932f6049a0482853056ffd617c91ffcc754205" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", - "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/56932f6049a0482853056ffd617c91ffcc754205", + "reference": "56932f6049a0482853056ffd617c91ffcc754205", "shasum": "" }, "require": { @@ -1963,7 +1964,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/4.2.4" + "source": "https://github.com/sebastianbergmann/environment/tree/4.2.5" }, "funding": [ { @@ -1971,24 +1972,24 @@ "type": "github" } ], - "time": "2020-11-30T07:53:42+00:00" + "time": "2024-03-01T13:49:59+00:00" }, { "name": "sebastian/exporter", - "version": "3.1.4", + "version": "3.1.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db" + "reference": "64cfeaa341951ceb2019d7b98232399d57bb2296" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0c32ea2e40dbf59de29f3b49bf375176ce7dd8db", - "reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64cfeaa341951ceb2019d7b98232399d57bb2296", + "reference": "64cfeaa341951ceb2019d7b98232399d57bb2296", "shasum": "" }, "require": { - "php": ">=7.0", + "php": ">=7.2", "sebastian/recursion-context": "^3.0" }, "require-dev": { @@ -2040,15 +2041,27 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.4" + "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.8" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" } ], - "time": "2021-11-11T13:51:24+00:00" + "time": "2025-09-24T05:55:14+00:00" }, { "name": "sebastian/global-state", @@ -2107,16 +2120,16 @@ }, { "name": "sebastian/object-enumerator", - "version": "3.0.4", + "version": "3.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2" + "reference": "ac5b293dba925751b808e02923399fb44ff0d541" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", - "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/ac5b293dba925751b808e02923399fb44ff0d541", + "reference": "ac5b293dba925751b808e02923399fb44ff0d541", "shasum": "" }, "require": { @@ -2152,7 +2165,7 @@ "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.4" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.5" }, "funding": [ { @@ -2160,20 +2173,20 @@ "type": "github" } ], - "time": "2020-11-30T07:40:27+00:00" + "time": "2024-03-01T13:54:02+00:00" }, { "name": "sebastian/object-reflector", - "version": "1.1.2", + "version": "1.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d" + "reference": "1d439c229e61f244ff1f211e5c99737f90c67def" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", - "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/1d439c229e61f244ff1f211e5c99737f90c67def", + "reference": "1d439c229e61f244ff1f211e5c99737f90c67def", "shasum": "" }, "require": { @@ -2207,7 +2220,7 @@ "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.2" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.3" }, "funding": [ { @@ -2215,20 +2228,20 @@ "type": "github" } ], - "time": "2020-11-30T07:37:18+00:00" + "time": "2024-03-01T13:56:04+00:00" }, { "name": "sebastian/recursion-context", - "version": "3.0.1", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb" + "reference": "8fe7e75986a9d24b4cceae847314035df7703a5a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/367dcba38d6e1977be014dc4b22f47a484dac7fb", - "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/8fe7e75986a9d24b4cceae847314035df7703a5a", + "reference": "8fe7e75986a9d24b4cceae847314035df7703a5a", "shasum": "" }, "require": { @@ -2270,28 +2283,40 @@ "homepage": "http://www.github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.1" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" } ], - "time": "2020-11-30T07:34:24+00:00" + "time": "2025-08-10T05:25:53+00:00" }, { "name": "sebastian/resource-operations", - "version": "2.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3" + "reference": "72a7f7674d053d548003b16ff5a106e7e0e06eee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/31d35ca87926450c44eae7e2611d45a7a65ea8b3", - "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/72a7f7674d053d548003b16ff5a106e7e0e06eee", + "reference": "72a7f7674d053d548003b16ff5a106e7e0e06eee", "shasum": "" }, "require": { @@ -2321,8 +2346,7 @@ "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/2.0.2" + "source": "https://github.com/sebastianbergmann/resource-operations/tree/2.0.3" }, "funding": [ { @@ -2330,7 +2354,7 @@ "type": "github" } ], - "time": "2020-11-30T07:30:19+00:00" + "time": "2024-03-01T13:59:09+00:00" }, { "name": "sebastian/version", @@ -2445,16 +2469,16 @@ }, { "name": "symfony/console", - "version": "v5.4.12", + "version": "v5.4.47", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "c072aa8f724c3af64e2c7a96b796a4863d24dba1" + "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/c072aa8f724c3af64e2c7a96b796a4863d24dba1", - "reference": "c072aa8f724c3af64e2c7a96b796a4863d24dba1", + "url": "https://api.github.com/repos/symfony/console/zipball/c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", + "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", "shasum": "" }, "require": { @@ -2519,12 +2543,12 @@ "homepage": "https://symfony.com", "keywords": [ "cli", - "command line", + "command-line", "console", "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.12" + "source": "https://github.com/symfony/console/tree/v5.4.47" }, "funding": [ { @@ -2540,20 +2564,20 @@ "type": "tidelift" } ], - "time": "2022-08-17T13:18:05+00:00" + "time": "2024-11-06T11:30:55+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.2", + "version": "v2.5.4", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/605389f2a7e5625f273b53960dc46aeaf9c62918", + "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918", "shasum": "" }, "require": { @@ -2561,12 +2585,12 @@ }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -2591,7 +2615,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.4" }, "funding": [ { @@ -2607,20 +2631,20 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/finder", - "version": "v5.4.11", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c" + "reference": "63741784cd7b9967975eec610b256eed3ede022b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/7872a66f57caffa2916a584db1aa7f12adc76f8c", - "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c", + "url": "https://api.github.com/repos/symfony/finder/zipball/63741784cd7b9967975eec610b256eed3ede022b", + "reference": "63741784cd7b9967975eec610b256eed3ede022b", "shasum": "" }, "require": { @@ -2654,7 +2678,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.11" + "source": "https://github.com/symfony/finder/tree/v5.4.45" }, "funding": [ { @@ -2670,24 +2694,24 @@ "type": "tidelift" } ], - "time": "2022-07-29T07:37:50+00:00" + "time": "2024-09-28T13:32:08+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.26.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-ctype": "*" @@ -2697,12 +2721,9 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -2736,7 +2757,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" }, "funding": [ { @@ -2747,41 +2768,42 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.26.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "433d05519ce6990bf3530fba6957499d327395c2" + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", - "reference": "433d05519ce6990bf3530fba6957499d327395c2", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -2817,7 +2839,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" }, "funding": [ { @@ -2828,41 +2850,42 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2025-06-27T09:58:17+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.26.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd" + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -2901,7 +2924,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" }, "funding": [ { @@ -2912,29 +2935,34 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.26.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", "shasum": "" }, "require": { - "php": ">=7.1" + "ext-iconv": "*", + "php": ">=7.2" }, "provide": { "ext-mbstring": "*" @@ -2944,12 +2972,9 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -2984,7 +3009,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" }, "funding": [ { @@ -2995,38 +3020,39 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2024-12-23T08:48:59+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.26.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -3063,7 +3089,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.33.0" }, "funding": [ { @@ -3074,38 +3100,39 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.26.0", + "version": "v1.33.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -3146,7 +3173,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" }, "funding": [ { @@ -3157,25 +3184,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-05-10T07:21:04+00:00" + "time": "2025-01-02T08:10:11+00:00" }, { "name": "symfony/process", - "version": "v5.4.11", + "version": "v5.4.51", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1" + "reference": "467bfc56f18f5ef6d5ccb09324d7e988c1c0a98f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/6e75fe6874cbc7e4773d049616ab450eff537bf1", - "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1", + "url": "https://api.github.com/repos/symfony/process/zipball/467bfc56f18f5ef6d5ccb09324d7e988c1c0a98f", + "reference": "467bfc56f18f5ef6d5ccb09324d7e988c1c0a98f", "shasum": "" }, "require": { @@ -3208,7 +3239,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.11" + "source": "https://github.com/symfony/process/tree/v5.4.51" }, "funding": [ { @@ -3219,25 +3250,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-06-27T16:58:25+00:00" + "time": "2026-01-26T15:53:37+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.5.2", + "version": "v2.5.4", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + "reference": "f37b419f7aea2e9abf10abd261832cace12e3300" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f37b419f7aea2e9abf10abd261832cace12e3300", + "reference": "f37b419f7aea2e9abf10abd261832cace12e3300", "shasum": "" }, "require": { @@ -3253,12 +3288,12 @@ }, "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -3291,7 +3326,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/service-contracts/tree/v2.5.4" }, "funding": [ { @@ -3307,20 +3342,20 @@ "type": "tidelift" } ], - "time": "2022-05-30T19:17:29+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/string", - "version": "v5.4.12", + "version": "v5.4.47", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "2fc515e512d721bf31ea76bd02fe23ada4640058" + "reference": "136ca7d72f72b599f2631aca474a4f8e26719799" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/2fc515e512d721bf31ea76bd02fe23ada4640058", - "reference": "2fc515e512d721bf31ea76bd02fe23ada4640058", + "url": "https://api.github.com/repos/symfony/string/zipball/136ca7d72f72b599f2631aca474a4f8e26719799", + "reference": "136ca7d72f72b599f2631aca474a4f8e26719799", "shasum": "" }, "require": { @@ -3377,7 +3412,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.12" + "source": "https://github.com/symfony/string/tree/v5.4.47" }, "funding": [ { @@ -3393,20 +3428,20 @@ "type": "tidelift" } ], - "time": "2022-08-12T17:03:11+00:00" + "time": "2024-11-10T20:33:58+00:00" }, { "name": "symfony/yaml", - "version": "v5.4.12", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "7a3aa21ac8ab1a96cc6de5bbcab4bc9fc943b18c" + "reference": "a454d47278cc16a5db371fe73ae66a78a633371e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/7a3aa21ac8ab1a96cc6de5bbcab4bc9fc943b18c", - "reference": "7a3aa21ac8ab1a96cc6de5bbcab4bc9fc943b18c", + "url": "https://api.github.com/repos/symfony/yaml/zipball/a454d47278cc16a5db371fe73ae66a78a633371e", + "reference": "a454d47278cc16a5db371fe73ae66a78a633371e", "shasum": "" }, "require": { @@ -3452,7 +3487,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.12" + "source": "https://github.com/symfony/yaml/tree/v5.4.45" }, "funding": [ { @@ -3468,20 +3503,20 @@ "type": "tidelift" } ], - "time": "2022-08-02T15:52:22+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.1", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", "shasum": "" }, "require": { @@ -3510,7 +3545,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + "source": "https://github.com/theseer/tokenizer/tree/1.3.1" }, "funding": [ { @@ -3518,20 +3553,20 @@ "type": "github" } ], - "time": "2021-07-28T10:34:58+00:00" + "time": "2025-11-17T20:03:58+00:00" }, { "name": "yoast/phpunit-polyfills", - "version": "1.0.3", + "version": "1.1.5", "source": { "type": "git", "url": "https://github.com/Yoast/PHPUnit-Polyfills.git", - "reference": "5ea3536428944955f969bc764bbe09738e151ada" + "reference": "41aaac462fbd80feb8dd129e489f4bbc53fe26b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Yoast/PHPUnit-Polyfills/zipball/5ea3536428944955f969bc764bbe09738e151ada", - "reference": "5ea3536428944955f969bc764bbe09738e151ada", + "url": "https://api.github.com/repos/Yoast/PHPUnit-Polyfills/zipball/41aaac462fbd80feb8dd129e489f4bbc53fe26b0", + "reference": "41aaac462fbd80feb8dd129e489f4bbc53fe26b0", "shasum": "" }, "require": { @@ -3539,13 +3574,14 @@ "phpunit/phpunit": "^4.8.36 || ^5.7.21 || ^6.0 || ^7.0 || ^8.0 || ^9.0" }, "require-dev": { - "yoast/yoastcs": "^2.2.0" + "php-parallel-lint/php-console-highlighter": "^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "yoast/yoastcs": "^3.2.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.x-dev", - "dev-develop": "1.x-dev" + "dev-main": "4.x-dev" } }, "autoload": { @@ -3577,9 +3613,10 @@ ], "support": { "issues": "https://github.com/Yoast/PHPUnit-Polyfills/issues", + "security": "https://github.com/Yoast/PHPUnit-Polyfills/security/policy", "source": "https://github.com/Yoast/PHPUnit-Polyfills" }, - "time": "2021-11-23T01:37:03+00:00" + "time": "2025-08-10T04:54:36+00:00" }, { "name": "yosymfony/resource-watcher", @@ -3642,14 +3679,15 @@ "aliases": [], "minimum-stability": "stable", "stability-flags": { + "phpdocumentor/reflection": 20, "scribu/lib-posts-to-posts": 20, "scribu/scb-framework": 20 }, "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=5.4" + "php": ">=7.4" }, - "platform-dev": [], - "plugin-api-version": "2.3.0" + "platform-dev": {}, + "plugin-api-version": "2.9.0" } diff --git a/lib/class-file-reflector.php b/lib/class-file-reflector.php index 62f401d..31074df 100644 --- a/lib/class-file-reflector.php +++ b/lib/class-file-reflector.php @@ -40,7 +40,7 @@ class File_Reflector extends FileReflector { /** * Last DocBlock associated with a non-documentable element. * - * @var \PHPParser_Comment_Doc + * @var \PhpParser\Comment\Doc */ protected $last_doc = null; @@ -61,9 +61,9 @@ class File_Reflector extends FileReflector { * Finally, we pick up any docblocks for nodes that usually aren't documentable, * so they can be assigned to the hooks to which they may belong. * - * @param \PHPParser_Node $node + * @param \PhpParser\Node $node */ - public function enterNode( \PHPParser_Node $node ) { + public function enterNode( \PhpParser\Node $node ) { parent::enterNode( $node ); switch ( $node->getType() ) { @@ -126,7 +126,11 @@ public function enterNode( \PHPParser_Node $node ) { // we don't ignore them, we'll end up picking up docblocks that are already // associated with a named element, and so aren't really from a non- // documentable element after all. - if ( ! $this->isNodeDocumentable( $node ) && 'Name' !== $node->getType() && ( $docblock = $node->getDocComment() ) ) { + if ( + ! $this->isNodeDocumentable( $node ) + && 'Name' !== $node->getType() + && 'Name_FullyQualified' !== $node->getType() + && ( $docblock = $node->getDocComment() ) ) { $this->last_doc = $docblock; } } @@ -137,9 +141,9 @@ public function enterNode( \PHPParser_Node $node ) { * We can now access the function/method reflectors, so we can assign any queued * hooks to them. The reflector for a node isn't created until the node is left. * - * @param \PHPParser_Node $node + * @param \PhpParser\Node $node */ - public function leaveNode( \PHPParser_Node $node ) { + public function leaveNode( \PhpParser\Node $node ) { parent::leaveNode( $node ); @@ -192,13 +196,15 @@ public function leaveNode( \PHPParser_Node $node ) { } /** - * @param \PHPParser_Node $node + * @param \PhpParser\Node $node * * @return bool */ - protected function isFilter( \PHPParser_Node $node ) { - // Ignore variable functions - if ( 'Name' !== $node->name->getType() ) { + protected function isFilter( \PhpParser\Node $node ) { + if ( + 'Name' !== $node->name->getType() && + 'Name_FullyQualified' !== $node->name->getType() + ) { return false; } @@ -224,13 +230,13 @@ protected function getLocation() { } /** - * @param \PHPParser_Node $node + * @param \PhpParser\Node $node * * @return bool */ - protected function isNodeDocumentable( \PHPParser_Node $node ) { + protected function isNodeDocumentable( \PhpParser\Node $node ) { return parent::isNodeDocumentable( $node ) - || ( $node instanceof \PHPParser_Node_Expr_FuncCall + || ( $node instanceof \PhpParser\Node\Expr\FuncCall && $this->isFilter( $node ) ); } } diff --git a/lib/class-function-call-reflector.php b/lib/class-function-call-reflector.php index 233e6d8..6fa42a7 100644 --- a/lib/class-function-call-reflector.php +++ b/lib/class-function-call-reflector.php @@ -25,24 +25,24 @@ public function getName() { $shortName = $this->getShortName(); - if ( is_a( $shortName, 'PHPParser_Node_Name_FullyQualified' ) ) { + if ( is_a( $shortName, 'PhpParser\Node\Name\FullyQualified' ) ) { return '\\' . (string) $shortName; } - if ( is_a( $shortName, 'PHPParser_Node_Name' ) ) { + if ( is_a( $shortName, 'PhpParser\Node\Name' ) ) { return (string) $shortName; } - /** @var \PHPParser_Node_Expr_ArrayDimFetch $shortName */ - if ( is_a( $shortName, 'PHPParser_Node_Expr_ArrayDimFetch' ) ) { + /** @var \PhpParser\Node\Expr\ArrayDimFetch $shortName */ + if ( is_a( $shortName, 'PhpParser\Node\Expr\ArrayDimFetch' ) ) { $var = $shortName->var->name; $dim = $shortName->dim->name->parts[0]; return "\${$var}[{$dim}]"; } - /** @var \PHPParser_Node_Expr_Variable $shortName */ - if ( is_a( $shortName, 'PHPParser_Node_Expr_Variable' ) ) { + /** @var \PhpParser\Node\Expr\Variable $shortName */ + if ( is_a( $shortName, 'PhpParser\Node\Expr\Variable' ) ) { return $shortName->name; } diff --git a/lib/class-hook-reflector.php b/lib/class-hook-reflector.php index 50075e0..1fa5352 100644 --- a/lib/class-hook-reflector.php +++ b/lib/class-hook-reflector.php @@ -3,7 +3,6 @@ namespace WP_Parser; use phpDocumentor\Reflection\BaseReflector; -use PHPParser_PrettyPrinter_Default; /** * Custom reflector for WordPress hooks. @@ -14,7 +13,7 @@ class Hook_Reflector extends BaseReflector { * @return string */ public function getName() { - $printer = new PHPParser_PrettyPrinter_Default; + $printer = new \PhpParser\PrettyPrinter\Standard(); return $this->cleanupName( $printer->prettyPrintExpr( $this->node->args[0]->value ) ); } diff --git a/lib/class-method-call-reflector.php b/lib/class-method-call-reflector.php index 570d5a5..20289e2 100644 --- a/lib/class-method-call-reflector.php +++ b/lib/class-method-call-reflector.php @@ -32,22 +32,26 @@ public function getName() { $caller = $this->node->var; } - if ( $caller instanceof \PHPParser_Node_Expr ) { + if ( $caller instanceof \PhpParser\Node\Expr ) { $printer = new Pretty_Printer; $caller = $printer->prettyPrintExpr( $caller ); - } elseif ( $caller instanceof \PHPParser_Node_Name_FullyQualified ) { + } elseif ( $caller instanceof \PhpParser\Node\Name\FullyQualified ) { $caller = '\\' . $caller->toString(); - } elseif ( $caller instanceof \PHPParser_Node_Name ) { + } elseif ( $caller instanceof \PhpParser\Node\Name ) { $caller = $caller->toString(); + } elseif ( $caller instanceof \PhpParser\Node\Stmt\Class_ ) { + $caller = $caller->isAnonymous() + ? 'class@anonymous' + : $caller->name; } $caller = $this->_resolveName( $caller ); // If the caller is a function, convert it to the function name - if ( is_a( $caller, 'PHPParser_Node_Expr_FuncCall' ) ) { + if ( is_a( $caller, 'PhpParser\Node\Expr\FuncCall' ) ) { // Add parentheses to signify this is a function call - /** @var \PHPParser_Node_Expr_FuncCall $caller */ + /** @var \PhpParser\Node\Expr\FuncCall $caller */ $caller = implode( '\\', $caller->name->parts ) . '()'; } @@ -134,13 +138,12 @@ protected function _getClassMapping() { * * @return string The resolved class name. */ - protected function _resolveName( $class ) { + protected function _resolveName( string $class ): string { if ( ! $this->called_in_class ) { return $class; } - switch ( $class ) { case '$this': case 'self': diff --git a/lib/class-pretty-printer.php b/lib/class-pretty-printer.php index 31c37e2..3ba2ad0 100644 --- a/lib/class-pretty-printer.php +++ b/lib/class-pretty-printer.php @@ -2,21 +2,18 @@ namespace WP_Parser; -use PHPParser_Node_Arg; -use PHPParser_PrettyPrinter_Default; - /** * Extends default printer for arguments. */ -class Pretty_Printer extends PHPParser_PrettyPrinter_Default { +class Pretty_Printer extends \PhpParser\PrettyPrinter\Standard { /** * Pretty prints an argument. * - * @param PHPParser_Node_Arg $node Expression argument + * @param \PhpParser\Node\Arg $node Expression argument * * @return string Pretty printed argument */ - public function prettyPrintArg( PHPParser_Node_Arg $node ) { + public function prettyPrintArg( \PhpParser\Node\Arg $node ) { return str_replace( "\n" . $this->noIndentToken, "\n", $this->p( $node ) ); } } diff --git a/lib/class-static-method-call-reflector.php b/lib/class-static-method-call-reflector.php index 9d39c7c..6f50c3d 100644 --- a/lib/class-static-method-call-reflector.php +++ b/lib/class-static-method-call-reflector.php @@ -12,10 +12,18 @@ class Static_Method_Call_Reflector extends Method_Call_Reflector { * * @return string[] Index 0 is the class name, 1 is the method name. */ - public function getName() { + public function getName(): array { $class = $this->node->class; - $prefix = ( is_a( $class, 'PHPParser_Node_Name_FullyQualified' ) ) ? '\\' : ''; - $class = $prefix . $this->_resolveName( implode( '\\', $class->parts ) ); + $prefix = ( is_a( $class, 'PhpParser\Node\Name\FullyQualified' ) ) ? '\\' : ''; + + if ( $class instanceof \PhpParser\Node\Stmt\Class_ && $class->isAnonymous() ) { + $class = 'class@anonymous'; + } elseif ( $class instanceof \PhpParser\Node\Expr\Variable ) { + // Static calls like `$foo::bar()` + $class = "\${$class->name}"; + } else { + $class = $prefix . $this->_resolveName( implode( '\\', $class->parts ) ); + } return array( $class, $this->getShortName() ); } diff --git a/lib/runner.php b/lib/runner.php index ba3efdd..6279f5a 100644 --- a/lib/runner.php +++ b/lib/runner.php @@ -47,87 +47,92 @@ function get_wp_files( $directory ) { function parse_files( $files, $root ) { $output = array(); - foreach ( $files as $filename ) { - $file = new File_Reflector( $filename ); - - $path = ltrim( substr( $filename, strlen( $root ) ), DIRECTORY_SEPARATOR ); - $file->setFilename( $path ); - - $file->process(); + try { + foreach ( $files as $filename ) { + $file = new File_Reflector( $filename ); - // TODO proper exporter - $out = array( - 'file' => export_docblock( $file ), - 'path' => str_replace( DIRECTORY_SEPARATOR, '/', $file->getFilename() ), - 'root' => $root, - ); + $path = ltrim( substr( $filename, strlen( $root ) ), DIRECTORY_SEPARATOR ); + $file->setFilename( $path ); - if ( ! empty( $file->uses ) ) { - $out['uses'] = export_uses( $file->uses ); - } + $file->process(); - foreach ( $file->getIncludes() as $include ) { - $out['includes'][] = array( - 'name' => $include->getName(), - 'line' => $include->getLineNumber(), - 'type' => $include->getType(), + // TODO proper exporter + $out = array( + 'file' => export_docblock( $file ), + 'path' => str_replace( DIRECTORY_SEPARATOR, '/', $file->getFilename() ), + 'root' => $root, ); - } - foreach ( $file->getConstants() as $constant ) { - $out['constants'][] = array( - 'name' => $constant->getShortName(), - 'line' => $constant->getLineNumber(), - 'value' => $constant->getValue(), - ); - } + if ( ! empty( $file->uses ) ) { + $out['uses'] = export_uses( $file->uses ); + } - if ( ! empty( $file->uses['hooks'] ) ) { - $out['hooks'] = export_hooks( $file->uses['hooks'] ); - } + foreach ( $file->getIncludes() as $include ) { + $out['includes'][] = array( + 'name' => $include->getName(), + 'line' => $include->getLineNumber(), + 'type' => $include->getType(), + ); + } - foreach ( $file->getFunctions() as $function ) { - $func = array( - 'name' => $function->getShortName(), - 'namespace' => $function->getNamespace(), - 'aliases' => $function->getNamespaceAliases(), - 'line' => $function->getLineNumber(), - 'end_line' => $function->getNode()->getAttribute( 'endLine' ), - 'arguments' => export_arguments( $function->getArguments() ), - 'doc' => export_docblock( $function ), - 'hooks' => array(), - ); + foreach ( $file->getConstants() as $constant ) { + $out['constants'][] = array( + 'name' => $constant->getShortName(), + 'line' => $constant->getLineNumber(), + 'value' => $constant->getValue(), + ); + } - if ( ! empty( $function->uses ) ) { - $func['uses'] = export_uses( $function->uses ); + if ( ! empty( $file->uses['hooks'] ) ) { + $out['hooks'] = export_hooks( $file->uses['hooks'] ); + } - if ( ! empty( $function->uses['hooks'] ) ) { - $func['hooks'] = export_hooks( $function->uses['hooks'] ); + foreach ( $file->getFunctions() as $function ) { + $func = array( + 'name' => $function->getShortName(), + 'namespace' => $function->getNamespace(), + 'aliases' => $function->getNamespaceAliases(), + 'line' => $function->getLineNumber(), + 'end_line' => $function->getNode()->getAttribute( 'endLine' ), + 'arguments' => export_arguments( $function->getArguments() ), + 'doc' => export_docblock( $function ), + 'hooks' => array(), + ); + + if ( ! empty( $function->uses ) ) { + $func['uses'] = export_uses( $function->uses ); + + if ( ! empty( $function->uses['hooks'] ) ) { + $func['hooks'] = export_hooks( $function->uses['hooks'] ); + } } - } - $out['functions'][] = $func; - } + $out['functions'][] = $func; + } - foreach ( $file->getClasses() as $class ) { - $class_data = array( - 'name' => $class->getShortName(), - 'namespace' => $class->getNamespace(), - 'line' => $class->getLineNumber(), - 'end_line' => $class->getNode()->getAttribute( 'endLine' ), - 'final' => $class->isFinal(), - 'abstract' => $class->isAbstract(), - 'extends' => $class->getParentClass(), - 'implements' => $class->getInterfaces(), - 'properties' => export_properties( $class->getProperties() ), - 'methods' => export_methods( $class->getMethods() ), - 'doc' => export_docblock( $class ), - ); + foreach ( $file->getClasses() as $class ) { + $class_data = array( + 'name' => $class->getShortName(), + 'namespace' => $class->getNamespace(), + 'line' => $class->getLineNumber(), + 'end_line' => $class->getNode()->getAttribute( 'endLine' ), + 'final' => $class->isFinal(), + 'abstract' => $class->isAbstract(), + 'extends' => $class->getParentClass(), + 'implements' => $class->getInterfaces(), + 'properties' => export_properties( $class->getProperties() ), + 'methods' => export_methods( $class->getMethods() ), + 'doc' => export_docblock( $class ), + ); + + $out['classes'][] = $class_data; + } - $out['classes'][] = $class_data; + $output[] = $out; } - - $output[] = $out; + } catch ( \Exception | \Error $e ) { + error_log( \sprintf( 'Error processing file [%s]: %s', $filename, $e->getMessage() ) ); + throw $e; } return $output; diff --git a/tests/phpunit/tests/export/uses/methods.php b/tests/phpunit/tests/export/uses/methods.php index 2def239..06c784c 100644 --- a/tests/phpunit/tests/export/uses/methods.php +++ b/tests/phpunit/tests/export/uses/methods.php @@ -95,7 +95,7 @@ public function test_instance_methods() { 'name' => 'call_method', 'line' => 10, 'end_line' => 10, - 'class' => 'get_class()', + 'class' => '\get_class()', 'static' => false, ) ); diff --git a/tests/phpunit/tests/export/uses/nested.php b/tests/phpunit/tests/export/uses/nested.php index 4caaef6..452ff6a 100644 --- a/tests/phpunit/tests/export/uses/nested.php +++ b/tests/phpunit/tests/export/uses/nested.php @@ -19,7 +19,7 @@ public function test_top_function_uses_correct() { $this->assertFunctionUsesFunction( 'test' , array( - 'name' => 'a_function', + 'name' => '\a_function', 'line' => 5, 'end_line' => 5, ) @@ -28,7 +28,7 @@ public function test_top_function_uses_correct() { $this->assertFunctionUsesFunction( 'test' , array( - 'name' => 'sub_test', + 'name' => '\sub_test', 'line' => 14, 'end_line' => 14, ) @@ -74,7 +74,7 @@ public function test_nested_function_uses_correct() { $this->assertFunctionUsesFunction( 'sub_test' , array( - 'name' => 'b_function', + 'name' => '\b_function', 'line' => 9, 'end_line' => 9, ) @@ -141,7 +141,7 @@ public function test_method_uses_correct() { 'My_Class' , 'a_method' , array( - 'name' => 'do_things', + 'name' => '\do_things', 'line' => 32, 'end_line' => 32, ) @@ -178,7 +178,7 @@ public function test_nested_function_in_method_uses_correct() { $this->assertFunctionUsesFunction( 'sub_method_test' , array( - 'name' => 'b_function', + 'name' => '\b_function', 'line' => 27, 'end_line' => 27, ) diff --git a/vendor-packages/phpdocumentor-reflection/.gitattributes b/vendor-packages/phpdocumentor-reflection/.gitattributes new file mode 100644 index 0000000..780e683 --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/.gitattributes @@ -0,0 +1 @@ +*.php text eol=lf \ No newline at end of file diff --git a/vendor-packages/phpdocumentor-reflection/.gitignore b/vendor-packages/phpdocumentor-reflection/.gitignore new file mode 100644 index 0000000..3ce5adb --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/.gitignore @@ -0,0 +1,2 @@ +.idea +vendor diff --git a/vendor-packages/phpdocumentor-reflection/.travis.yml b/vendor-packages/phpdocumentor-reflection/.travis.yml new file mode 100644 index 0000000..eef782c --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/.travis.yml @@ -0,0 +1,32 @@ +language: php +php: + - 5.3.3 + - 5.3 + - 5.4 + - 5.5 + - 5.6 + - hhvm + - hhvm-nightly + +matrix: + allow_failures: + - php: hhvm + - php: hhvm-nightly + +script: + - vendor/bin/phpunit + +before_script: + - sudo apt-get -qq update > /dev/null + - phpenv rehash > /dev/null + - composer selfupdate --quiet + - composer install --no-interaction --prefer-source --dev + - vendor/bin/phpunit + - composer update --no-interaction --prefer-source --dev + +notifications: + irc: "irc.freenode.org#phpdocumentor" + email: + - mike.vanriel@naenius.com + - ashnazg@php.net + - boen.robot@gmail.com diff --git a/vendor-packages/phpdocumentor-reflection/README.md b/vendor-packages/phpdocumentor-reflection/README.md new file mode 100644 index 0000000..4e4e345 --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/README.md @@ -0,0 +1,4 @@ +Reflection [![Build Status](https://secure.travis-ci.org/phpDocumentor/Reflection.png)](http://travis-ci.org/phpDocumentor/Reflection) +========== + +Reflection library to do Static Analysis for PHP Projects diff --git a/vendor-packages/phpdocumentor-reflection/composer.json b/vendor-packages/phpdocumentor-reflection/composer.json new file mode 100644 index 0000000..c3e34cd --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/composer.json @@ -0,0 +1,32 @@ +{ + "name": "phpdocumentor/reflection", + "description": "Reflection library to do Static Analysis for PHP Projects", + "keywords": ["phpdoc", "phpDocumentor", "reflection", "static analysis"], + "homepage": "http://www.phpdoc.org", + "license": "MIT", + "autoload": { + "psr-0": { + "phpDocumentor": ["src/", "tests/unit/", "tests/mocks/"] + } + }, + "require": { + "php": ">=5.3.3", + "psr/log": "~1.0", + "nikic/php-parser": "^3.0", + "phpdocumentor/reflection-docblock": "~2.0" + }, + "suggests": { + "symfony/event-dispatcher": "~2.1" + }, + "require-dev": { + "behat/behat": "~2.4", + "phpunit/phpunit": "~4.0", + "mockery/mockery": "~0.8" + }, + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev", + "dev-wp": "v3.0.2-dmsnell" + } + } +} diff --git a/vendor-packages/phpdocumentor-reflection/composer.lock b/vendor-packages/phpdocumentor-reflection/composer.lock new file mode 100644 index 0000000..ba5b162 --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/composer.lock @@ -0,0 +1,1517 @@ +{ + "_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" + ], + "hash": "a95f5fcfa7881ef2a6d076533216cc21", + "content-hash": "5f18bb38fd8e84b5f811b568bc546c0c", + "packages": [ + { + "name": "nikic/php-parser", + "version": "v1.4.1", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51", + "reference": "f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "files": [ + "lib/bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "time": "2015-09-19 14:15:08" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "38743b677965c48a637097b2746a281264ae2347" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/38743b677965c48a637097b2746a281264ae2347", + "reference": "38743b677965c48a637097b2746a281264ae2347", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "3.7.*@stable" + }, + "suggest": { + "dflydev/markdown": "1.0.*", + "erusev/parsedown": "~0.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ], + "time": "2014-08-09 10:27:07" + }, + { + "name": "psr/log", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b", + "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-0": { + "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", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2012-12-21 11:40:51" + } + ], + "packages-dev": [ + { + "name": "behat/behat", + "version": "v2.5.3", + "source": { + "type": "git", + "url": "https://github.com/Behat/Behat.git", + "reference": "c3a105a3c0457df919879c72b63b910e63739e51" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Behat/Behat/zipball/c3a105a3c0457df919879c72b63b910e63739e51", + "reference": "c3a105a3c0457df919879c72b63b910e63739e51", + "shasum": "" + }, + "require": { + "behat/gherkin": "~2.3.0", + "php": ">=5.3.1", + "symfony/config": "~2.0", + "symfony/console": "~2.0", + "symfony/dependency-injection": "~2.0", + "symfony/event-dispatcher": "~2.0", + "symfony/finder": "~2.0", + "symfony/translation": "~2.0", + "symfony/yaml": "~2.0" + }, + "require-dev": { + "phpunit/phpunit": "~3.7.19" + }, + "suggest": { + "behat/mink-extension": "for integration with Mink testing framework", + "behat/symfony2-extension": "for integration with Symfony2 web framework", + "behat/yii-extension": "for integration with Yii web framework" + }, + "bin": [ + "bin/behat" + ], + "type": "library", + "autoload": { + "psr-0": { + "Behat\\Behat": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + } + ], + "description": "Scenario-oriented BDD framework for PHP 5.3", + "homepage": "http://behat.org/", + "keywords": [ + "BDD", + "Behat", + "Symfony2" + ], + "time": "2014-04-26 16:55:16" + }, + { + "name": "behat/gherkin", + "version": "v2.3.5", + "source": { + "type": "git", + "url": "https://github.com/Behat/Gherkin.git", + "reference": "2b33963da5525400573560c173ab5c9c057e1852" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/2b33963da5525400573560c173ab5c9c057e1852", + "reference": "2b33963da5525400573560c173ab5c9c057e1852", + "shasum": "" + }, + "require": { + "php": ">=5.3.1", + "symfony/finder": "~2.0" + }, + "require-dev": { + "symfony/config": "~2.0", + "symfony/translation": "~2.0", + "symfony/yaml": "~2.0" + }, + "suggest": { + "symfony/config": "If you want to use Config component to manage resources", + "symfony/translation": "If you want to use Symfony2 translations adapter", + "symfony/yaml": "If you want to parse features, represented in YAML files" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-develop": "2.2-dev" + } + }, + "autoload": { + "psr-0": { + "Behat\\Gherkin": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + } + ], + "description": "Gherkin DSL parser for PHP 5.3", + "homepage": "http://behat.org/", + "keywords": [ + "BDD", + "Behat", + "DSL", + "Symfony2", + "parser" + ], + "time": "2013-10-15 11:22:17" + }, + { + "name": "mockery/mockery", + "version": "0.9.1", + "source": { + "type": "git", + "url": "https://github.com/padraic/mockery.git", + "reference": "17f63ee40ed14a8afb7ba1f0ae15cc4491d719d1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/padraic/mockery/zipball/17f63ee40ed14a8afb7ba1f0ae15cc4491d719d1", + "reference": "17f63ee40ed14a8afb7ba1f0ae15cc4491d719d1", + "shasum": "" + }, + "require": { + "lib-pcre": ">=7.0", + "php": ">=5.3.2" + }, + "require-dev": { + "hamcrest/hamcrest-php": "~1.1", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "~0.7@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.9.x-dev" + } + }, + "autoload": { + "psr-0": { + "Mockery": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "http://blog.astrumfutura.com" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "http://davedevelopment.co.uk" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework for use in unit testing with PHPUnit, PHPSpec or any other testing framework. Its core goal is to offer a test double framework with a succint API capable of clearly defining all possible object operations and interactions using a human readable Domain Specific Language (DSL). Designed as a drop in alternative to PHPUnit's phpunit-mock-objects library, Mockery is easy to integrate with PHPUnit and can operate alongside phpunit-mock-objects without the World ending.", + "homepage": "http://github.com/padraic/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "time": "2014-05-02 12:16:45" + }, + { + "name": "ocramius/instantiator", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/Ocramius/Instantiator.git", + "reference": "a7abbb5fc9df6e7126af741dd6c140d1a7369435" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Ocramius/Instantiator/zipball/a7abbb5fc9df6e7126af741dd6c140d1a7369435", + "reference": "a7abbb5fc9df6e7126af741dd6c140d1a7369435", + "shasum": "" + }, + "require": { + "ocramius/lazy-map": "1.0.*", + "php": "~5.3" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "ext-pdo": "*", + "ext-phar": "*", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "2.0.*@ALPHA" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Instantiator\\": "src" + } + }, + "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/Ocramius/Instantiator", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2014-08-14 15:10:55" + }, + { + "name": "ocramius/lazy-map", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/Ocramius/LazyMap.git", + "reference": "7fe3d347f5e618bcea7d39345ff83f3651d8b752" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Ocramius/LazyMap/zipball/7fe3d347f5e618bcea7d39345ff83f3651d8b752", + "reference": "7fe3d347f5e618bcea7d39345ff83f3651d8b752", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "athletic/athletic": "~0.1.6", + "phpmd/phpmd": "1.5.*", + "phpunit/phpunit": ">=3.7", + "satooshi/php-coveralls": "~0.6", + "squizlabs/php_codesniffer": "1.4.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "LazyMap\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/", + "role": "Developer" + } + ], + "description": "A library that provides lazy instantiation logic for a map of objects", + "homepage": "https://github.com/Ocramius/LazyMap", + "keywords": [ + "lazy", + "lazy instantiation", + "lazy loading", + "map", + "service location" + ], + "time": "2013-11-09 22:30:54" + }, + { + "name": "phpunit/php-code-coverage", + "version": "2.0.10", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "6d196af48e8c100a3ae881940123e693da5a9217" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6d196af48e8c100a3ae881940123e693da5a9217", + "reference": "6d196af48e8c100a3ae881940123e693da5a9217", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "phpunit/php-file-iterator": "~1.3.1", + "phpunit/php-text-template": "~1.2.0", + "phpunit/php-token-stream": "~1.2.2", + "sebastian/environment": "~1.0.0", + "sebastian/version": "~1.0.3" + }, + "require-dev": { + "ext-xdebug": ">=2.1.4", + "phpunit/phpunit": "~4.0.14" + }, + "suggest": { + "ext-dom": "*", + "ext-xdebug": ">=2.2.1", + "ext-xmlwriter": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.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": "2014-08-06 06:39:42" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.3.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/acd690379117b042d1c8af1fafd61bde001bf6bb", + "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "File/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "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": "2013-10-10 15:34:57" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", + "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "Text/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2014-01-30 17:20:04" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c", + "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "PHP/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "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": "2013-08-02 07:42:54" + }, + { + "name": "phpunit/php-token-stream", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "ad4e1e23ae01b483c16f600ff1bebec184588e32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/ad4e1e23ae01b483c16f600ff1bebec184588e32", + "reference": "ad4e1e23ae01b483c16f600ff1bebec184588e32", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "classmap": [ + "PHP/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2014-03-03 05:10:30" + }, + { + "name": "phpunit/phpunit", + "version": "4.2.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "a33fa68ece9f8c68589bfc2da8d2794e27b820bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a33fa68ece9f8c68589bfc2da8d2794e27b820bc", + "reference": "a33fa68ece9f8c68589bfc2da8d2794e27b820bc", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=5.3.3", + "phpunit/php-code-coverage": "~2.0", + "phpunit/php-file-iterator": "~1.3.1", + "phpunit/php-text-template": "~1.2", + "phpunit/php-timer": "~1.0.2", + "phpunit/phpunit-mock-objects": "~2.2", + "sebastian/comparator": "~1.0", + "sebastian/diff": "~1.1", + "sebastian/environment": "~1.0", + "sebastian/exporter": "~1.0", + "sebastian/version": "~1.0", + "symfony/yaml": "~2.0" + }, + "suggest": { + "phpunit/php-invoker": "~1.1" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "", + "../../symfony/yaml/" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "http://www.phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2014-08-18 05:12:30" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "42e589e08bc86e3e9bdf20d385e948347788505b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/42e589e08bc86e3e9bdf20d385e948347788505b", + "reference": "42e589e08bc86e3e9bdf20d385e948347788505b", + "shasum": "" + }, + "require": { + "ocramius/instantiator": "~1.0", + "php": ">=5.3.3", + "phpunit/php-text-template": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "4.2.*@dev" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "time": "2014-08-02 13:50:58" + }, + { + "name": "sebastian/comparator", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "f7069ee51fa9fb6c038e16a9d0e3439f5449dcf2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/f7069ee51fa9fb6c038e16a9d0e3439f5449dcf2", + "reference": "f7069ee51fa9fb6c038e16a9d0e3439f5449dcf2", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/diff": "~1.1", + "sebastian/exporter": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.1" + }, + "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", + "role": "lead" + }, + { + "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": "http://www.github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2014-05-02 07:05:58" + }, + { + "name": "sebastian/diff", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "1e091702a5a38e6b4c1ba9ca816e3dd343df2e2d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/1e091702a5a38e6b4c1ba9ca816e3dd343df2e2d", + "reference": "1e091702a5a38e6b4c1ba9ca816e3dd343df2e2d", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "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", + "role": "lead" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "http://www.github.com/sebastianbergmann/diff", + "keywords": [ + "diff" + ], + "time": "2013-08-03 16:46:33" + }, + { + "name": "sebastian/environment", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "79517609ec01139cd7e9fded0dd7ce08c952ef6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/79517609ec01139cd7e9fded0dd7ce08c952ef6a", + "reference": "79517609ec01139cd7e9fded0dd7ce08c952ef6a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "4.0.*@dev" + }, + "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", + "role": "lead" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2014-02-18 16:17:19" + }, + { + "name": "sebastian/exporter", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "1f9a98e6f5dfe0524cb8c6166f7c82f3e9ae1529" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/1f9a98e6f5dfe0524cb8c6166f7c82f3e9ae1529", + "reference": "1f9a98e6f5dfe0524cb8c6166f7c82f3e9ae1529", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "4.0.*@dev" + }, + "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", + "role": "lead" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net", + "role": "Lead" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2014-02-16 08:26:31" + }, + { + "name": "sebastian/version", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "b6e1f0cf6b9e1ec409a0d3e2f2a5fb0998e36b43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/b6e1f0cf6b9e1ec409a0d3e2f2a5fb0998e36b43", + "reference": "b6e1f0cf6b9e1ec409a0d3e2f2a5fb0998e36b43", + "shasum": "" + }, + "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": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2014-03-07 15:35:33" + }, + { + "name": "symfony/config", + "version": "v2.5.3", + "target-dir": "Symfony/Component/Config", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "8d044668c7ccb4ade684e368d910e3aadcff6f6c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/8d044668c7ccb4ade684e368d910e3aadcff6f6c", + "reference": "8d044668c7ccb4ade684e368d910e3aadcff6f6c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/filesystem": "~2.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Config\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony Config Component", + "homepage": "http://symfony.com", + "time": "2014-08-05 09:00:40" + }, + { + "name": "symfony/console", + "version": "v2.5.3", + "target-dir": "Symfony/Component/Console", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "cd2d1e4bac2206b337326b0140ff475fe9ad5f63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/cd2d1e4bac2206b337326b0140ff475fe9ad5f63", + "reference": "cd2d1e4bac2206b337326b0140ff475fe9ad5f63", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/event-dispatcher": "~2.1" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony Console Component", + "homepage": "http://symfony.com", + "time": "2014-08-05 09:00:40" + }, + { + "name": "symfony/dependency-injection", + "version": "v2.5.3", + "target-dir": "Symfony/Component/DependencyInjection", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "54529fdc797a88c030441773adadcc759bb102c2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/54529fdc797a88c030441773adadcc759bb102c2", + "reference": "54529fdc797a88c030441773adadcc759bb102c2", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/config": "~2.2", + "symfony/expression-language": "~2.4", + "symfony/yaml": "~2.0" + }, + "suggest": { + "symfony/config": "", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\DependencyInjection\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony DependencyInjection Component", + "homepage": "http://symfony.com", + "time": "2014-08-06 06:44:37" + }, + { + "name": "symfony/event-dispatcher", + "version": "v2.5.3", + "target-dir": "Symfony/Component/EventDispatcher", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "8faf5cc7e80fde74a650a36e60d32ce3c3e0457b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8faf5cc7e80fde74a650a36e60d32ce3c3e0457b", + "reference": "8faf5cc7e80fde74a650a36e60d32ce3c3e0457b", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.0", + "symfony/dependency-injection": "~2.0", + "symfony/stopwatch": "~2.2" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "http://symfony.com", + "time": "2014-07-28 13:20:46" + }, + { + "name": "symfony/filesystem", + "version": "v2.5.3", + "target-dir": "Symfony/Component/Filesystem", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "c1309b0ee195ad264a4314435bdaecdfacb8ae9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/c1309b0ee195ad264a4314435bdaecdfacb8ae9c", + "reference": "c1309b0ee195ad264a4314435bdaecdfacb8ae9c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Filesystem\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "http://symfony.com", + "time": "2014-07-09 09:05:48" + }, + { + "name": "symfony/finder", + "version": "v2.5.3", + "target-dir": "Symfony/Component/Finder", + "source": { + "type": "git", + "url": "https://github.com/symfony/Finder.git", + "reference": "090fe4eaff414d8f2171c7a4748ea868d530775f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Finder/zipball/090fe4eaff414d8f2171c7a4748ea868d530775f", + "reference": "090fe4eaff414d8f2171c7a4748ea868d530775f", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Finder\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony Finder Component", + "homepage": "http://symfony.com", + "time": "2014-07-28 13:20:46" + }, + { + "name": "symfony/translation", + "version": "v2.5.3", + "target-dir": "Symfony/Component/Translation", + "source": { + "type": "git", + "url": "https://github.com/symfony/Translation.git", + "reference": "ae573e45b099b1e2d332930ac626cd4270e09539" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Translation/zipball/ae573e45b099b1e2d332930ac626cd4270e09539", + "reference": "ae573e45b099b1e2d332930ac626cd4270e09539", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "symfony/config": "~2.0", + "symfony/yaml": "~2.2" + }, + "suggest": { + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony Translation Component", + "homepage": "http://symfony.com", + "time": "2014-07-28 13:20:46" + }, + { + "name": "symfony/yaml", + "version": "v2.5.3", + "target-dir": "Symfony/Component/Yaml", + "source": { + "type": "git", + "url": "https://github.com/symfony/Yaml.git", + "reference": "5a75366ae9ca8b4792cd0083e4ca4dff9fe96f1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/5a75366ae9ca8b4792cd0083e4ca4dff9fe96f1f", + "reference": "5a75366ae9ca8b4792cd0083e4ca4dff9fe96f1f", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev" + } + }, + "autoload": { + "psr-0": { + "Symfony\\Component\\Yaml\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony Yaml Component", + "homepage": "http://symfony.com", + "time": "2014-08-05 09:00:40" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=5.3.3" + }, + "platform-dev": [] +} diff --git a/vendor-packages/phpdocumentor-reflection/phpunit.xml.dist b/vendor-packages/phpdocumentor-reflection/phpunit.xml.dist new file mode 100644 index 0000000..b99c69b --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/phpunit.xml.dist @@ -0,0 +1,18 @@ + + + + + + ./tests/unit/ + + + + + src/phpDocumentor + + + + + + diff --git a/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/BaseReflector.php b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/BaseReflector.php new file mode 100644 index 0000000..9c74a0f --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/BaseReflector.php @@ -0,0 +1,318 @@ + + * @copyright 2010-2012 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +use Exception; +use InvalidArgumentException; +use phpDocumentor\Event\Dispatcher; +use phpDocumentor\Reflection\DocBlock; +use phpDocumentor\Reflection\DocBlock\Context; +use phpDocumentor\Reflection\DocBlock\Location; +use phpDocumentor\Reflection\Event\PostDocBlockExtractionEvent; +use PhpParser\NodeAbstract; +use Psr\Log\LogLevel; +use PhpParser\Node\Expr; +use PhpParser\Node\Stmt; +use PhpParser\PrettyPrinterAbstract; + +/** + * Basic reflection providing support for events and basic properties as a + * DocBlock and names. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +abstract class BaseReflector extends ReflectionAbstract +{ + /** @var \PhpParser\Node\Stmt */ + protected $node; + + /** + * The package name that is passed on by the parent Reflector. + * + * May be overwritten and should be passed on to children supporting + * packages. + * + * @var string + */ + protected $default_package_name = ''; + + /** + * PHP AST pretty printer used to get representations of values. + * + * @var \PhpParser\PrettyPrinterAbstract + */ + protected static $prettyPrinter = null; + + /** + * Initializes this reflector with the correct node as produced by + * PHP-Parser. + * + * @param NodeAbstract $node + * @param Context $context + * + * @link http://github.com/nikic/PHP-Parser + */ + public function __construct(NodeAbstract $node, Context $context) + { + $this->node = $node; + $context->setLSEN($this->getLSEN()); + $this->context = $context; + } + + /** + * Returns the current PHP-Parser node that holds more detailed information + * about the reflected object. e.g. position in the file and further attributes. + * @return \PhpParser\Node\Stmt|\PhpParser\NodeAbstract + */ + public function getNode() + { + return $this->node; + } + + /** + * Sets the name for the namespace. + * + * @param string $namespace + * + * @throws InvalidArgumentException if something other than a string is + * passed. + * + * @return void + */ + public function setNamespace($namespace) + { + if (!is_string($namespace)) { + throw new InvalidArgumentException( + 'Expected a string for the namespace' + ); + } + + $this->context->setNamespace($namespace); + } + + /** + * Returns the parsed DocBlock. + * + * @return DocBlock|null + */ + public function getDocBlock() + { + return $this->extractDocBlock($this->node); + } + + /** + * Extracts a parsed DocBlock from an object. + * + * @param object $node Any object with a "getDocComment()" method. + * + * @return DocBlock|null + */ + protected function extractDocBlock($node) + { + $doc_block = null; + $comment = $node->getDocComment(); + if ($comment) { + try { + $doc_block = new DocBlock( + (string) $comment, + $this->context, + new Location($comment->getLine()) + ); + } catch (Exception $e) { + $this->log($e->getMessage(), LogLevel::CRITICAL); + } + } + + if (class_exists('phpDocumentor\Event\Dispatcher')) { + Dispatcher::getInstance()->dispatch( + 'reflection.docblock-extraction.post', + PostDocBlockExtractionEvent + ::createInstance($this)->setDocblock($doc_block) + ); + } + + return $doc_block; + } + + /** + * Returns the name for this Reflector instance. + * + * @return string + */ + public function getName() + { + if (isset($this->node->namespacedName)) { + return '\\'.implode('\\', $this->node->namespacedName->parts); + } + + return $this->getShortName(); + } + + /** + * Returns the last component of a namespaced name as a short form. + * + * @return string + */ + public function getShortName() + { + if ( isset($this->node->name) ) { + return $this->node->name; + } + if ( $this->node instanceof \Stringable ){ + return (string) $this->node; + } + if ( $this->node instanceof \PhpParser\Node\Stmt\Class_ && $this->node->isAnonymous() ) { + return 'class@anonymous'; + } + } + + /** + * Gets the LSEN. + * + * Returns this element's Local Structural Element Name (LSEN). This name + * consistents of the element's short name, along with punctuation that + * hints at the kind of structural element. If the structural element is + * part of a type (i.e. an interface/trait/class' property/method/constant), + * it also contains the name of the owning type. + * + * @return string + */ + public function getLSEN() + { + return ''; + } + + /** + * Returns the namespace name for this object. + * + * If this object does not have a namespace then the word 'global' is + * returned to indicate a global namespace. + * + * @return string + */ + public function getNamespace() + { + if (!isset($this->node->namespacedName)) { + return $this->context->getNamespace(); + } + + $parts = $this->node->namespacedName->parts; + array_pop($parts); + + $namespace = implode('\\', $parts); + + return $namespace ? $namespace : 'global'; + } + + /** + * Returns a listing of namespace aliases where the key represents the alias + * and the value the Fully Qualified Namespace Name. + * + * @return string[] + */ + public function getNamespaceAliases() + { + return $this->context->getNamespaceAliases(); + } + + /** + * Sets a listing of namespace aliases. + * + * The keys represents the alias name and the value the + * Fully Qualified Namespace Name (FQNN). + * + * @param string[] $aliases + * + * @return void + */ + public function setNamespaceAliases(array $aliases) + { + $this->context->setNamespaceAliases($aliases); + } + + /** + * Sets the Fully Qualified Namespace Name (FQNN) for an alias. + * + * @param string $alias + * @param string $fqnn + * + * @return void + */ + public function setNamespaceAlias($alias, $fqnn) + { + $this->context->setNamespaceAlias($alias, $fqnn); + } + + /** + * Returns the line number where this object starts. + * + * @return int + */ + public function getLinenumber() + { + return $this->node->getLine(); + } + + /** + * Sets the default package name for this object. + * + * If the DocBlock contains a different package name then that overrides + * this package name. + * + * @param string $default_package_name The name of the package as defined + * in the PHPDoc Standard. + * + * @return void + */ + public function setDefaultPackageName($default_package_name) + { + $this->default_package_name = $default_package_name; + } + + /** + * Returns the package name that is default for this element. + * + * This value may change after the DocBlock is interpreted. If that contains + * a package tag then that tag overrides the Default package name. + * + * @return string + */ + public function getDefaultPackageName() + { + return $this->default_package_name; + } + + /** + * Returns a simple human readable output for a value. + * + * @param \PhpParser\Node\Expr $value The value node as provided by + * PHP-Parser. + * + * @return string + */ + protected function getRepresentationOfValue( + \PhpParser\Node\Expr $value = null + ) { + if (null === $value) { + return ''; + } + + if (!self::$prettyPrinter) { + self::$prettyPrinter = new PrettyPrinter(); + } + + return self::$prettyPrinter->prettyPrintExpr($value); + } +} diff --git a/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/ClassReflector.php b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/ClassReflector.php new file mode 100644 index 0000000..1faa37e --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/ClassReflector.php @@ -0,0 +1,100 @@ + + * @copyright 2010-2012 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +use PhpParser\Node\Name; +use PhpParser\Node\Stmt\Class_; +use PhpParser\Node\Stmt\TraitUse; + +/** + * Provides static reflection for a class. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class ClassReflector extends InterfaceReflector +{ + /** @var Class_ */ + protected $node; + + /** @var string[] */ + protected $traits = array(); + + public function parseSubElements() + { + /** @var TraitUse $stmt */ + foreach ($this->node->stmts as $stmt) { + if ($stmt instanceof TraitUse) { + foreach ($stmt->traits as $trait) { + $this->traits[] = '\\' . (string) $trait; + } + } + } + + parent::parseSubElements(); + } + + /** + * Returns whether this is an abstract class. + * + * @return bool + */ + public function isAbstract() + { + return (bool) ($this->node->type & Class_::MODIFIER_ABSTRACT); + } + + /** + * Returns whether this class is final and thus cannot be extended. + * + * @return bool + */ + public function isFinal() + { + return (bool) ($this->node->type & Class_::MODIFIER_FINAL); + } + + /** + * Returns a list of the names of traits used in this class. + * + * @return string[] + */ + public function getTraits() + { + return $this->traits; + } + + public function getParentClass() + { + return isset($this->node->extends) ? '\\'.(string) $this->node->extends : ''; + } + + /** + * BC Break: used to be getParentInterfaces + * + * @return string[] Names of interfaces the class implements. + */ + public function getInterfaces() + { + $names = array(); + if (isset($this->node->implements)) { + /** @var Name */ + foreach ($this->node->implements as $node) { + $names[] = '\\'.(string) $node; + } + } + + return $names; + } +} diff --git a/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/ClassReflector/ConstantReflector.php b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/ClassReflector/ConstantReflector.php new file mode 100644 index 0000000..580a318 --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/ClassReflector/ConstantReflector.php @@ -0,0 +1,41 @@ + + * @copyright 2010-2012 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\ClassReflector; + +use phpDocumentor\Reflection\BaseReflector; +use phpDocumentor\Reflection\ConstantReflector as BaseConstantReflector; +use phpDocumentor\Reflection\DocBlock\Context; +use PhpParser\Node\Stmt\ClassConst; +use PhpParser\Node\Const_; + +class ConstantReflector extends BaseConstantReflector +{ + /** @var ClassConst */ + protected $constant; + + /** + * Registers the Constant Statement and Node with this reflector. + * + * @param ClassConst $stmt + * @param Context $context + * @param Const_ $node + */ + public function __construct( + ClassConst $stmt, + Context $context, + Const_ $node + ) { + BaseReflector::__construct($node, $context); + $this->constant = $stmt; + } +} diff --git a/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/ClassReflector/MethodReflector.php b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/ClassReflector/MethodReflector.php new file mode 100644 index 0000000..9fe6990 --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/ClassReflector/MethodReflector.php @@ -0,0 +1,78 @@ + + * @copyright 2010-2012 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\ClassReflector; + +use phpDocumentor\Reflection\FunctionReflector; +use PhpParser\Node\Stmt\Class_; + +class MethodReflector extends FunctionReflector +{ + /** @var \PhpParser\Node\Stmt\ClassMethod */ + protected $node; + + /** + * Returns the visibility for this item. + * + * The returned value should match either of the following: + * + * * public + * * protected + * * private + * + * If a method has no visibility set in the class definition this method + * will return 'public'. + * + * @return string + */ + public function getVisibility() + { + if ($this->node->type & Class_::MODIFIER_PROTECTED) { + return 'protected'; + } + if ($this->node->type & Class_::MODIFIER_PRIVATE) { + return 'private'; + } + + return 'public'; + } + + /** + * Returns whether this method is static. + * + * @return bool + */ + public function isAbstract() + { + return (bool) ($this->node->type & Class_::MODIFIER_ABSTRACT); + } + + /** + * Returns whether this method is static. + * + * @return bool + */ + public function isStatic() + { + return (bool) ($this->node->type & Class_::MODIFIER_STATIC); + } + + /** + * Returns whether this method is final. + * + * @return bool + */ + public function isFinal() + { + return (bool) ($this->node->type & Class_::MODIFIER_FINAL); + } +} diff --git a/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/ClassReflector/PropertyReflector.php b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/ClassReflector/PropertyReflector.php new file mode 100644 index 0000000..aba8e7b --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/ClassReflector/PropertyReflector.php @@ -0,0 +1,107 @@ + + * @copyright 2010-2012 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\ClassReflector; + +use phpDocumentor\Reflection\BaseReflector; +use phpDocumentor\Reflection\DocBlock; +use phpDocumentor\Reflection\DocBlock\Context; +use PhpParser\Node\Stmt\Class_; +use PhpParser\Node\Stmt\Property; +use PhpParser\Node\Stmt\PropertyProperty; + +class PropertyReflector extends BaseReflector +{ + /** @var Property */ + protected $property; + + /** @var PropertyProperty */ + protected $node; + + public function __construct( + Property $property, + Context $context, + PropertyProperty $node + ) { + parent::__construct($node, $context); + $this->property = $property; + } + + public function getName() + { + return '$'.parent::getName(); + } + + /** + * Returns the default value or null if none found. + * + * Please note that if the default value is null that this method returns + * string 'null'. + * + * @return null|string + */ + public function getDefault() + { + $result = null; + if ($this->node->default) { + $result = $this->getRepresentationOfValue($this->node->default); + } + + return $result; + } + + /** + * Returns the visibility for this item. + * + * The returned value should match either of the following: + * + * * public + * * protected + * * private + * + * If a method has no visibility set in the class definition this method + * will return 'public'. + * + * @return string + */ + public function getVisibility() + { + if ($this->property->type & \PhpParser\Node\Stmt\Class_::MODIFIER_PROTECTED) { + return 'protected'; + } + if ($this->property->type & \PhpParser\Node\Stmt\Class_::MODIFIER_PRIVATE) { + return 'private'; + } + + return 'public'; + } + + /** + * Returns whether this property is static. + * + * @return bool + */ + public function isStatic() + { + return (bool) ($this->property->type & \PhpParser\Node\Stmt\Class_::MODIFIER_STATIC); + } + + /** + * Returns the parsed DocBlock. + * + * @return DocBlock|null + */ + public function getDocBlock() + { + return $this->extractDocBlock($this->property); + } +} diff --git a/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/ConstantReflector.php b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/ConstantReflector.php new file mode 100644 index 0000000..cd106c1 --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/ConstantReflector.php @@ -0,0 +1,69 @@ + + * @copyright 2010-2012 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +use phpDocumentor\Reflection\DocBlock; +use phpDocumentor\Reflection\DocBlock\Context; +use PhpParser\Node\Const_; +use PhpParser\Node\Stmt\Const_ as ConstStmt; + +/** + * Provides Static Reflection for file-level constants. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class ConstantReflector extends BaseReflector +{ + /** @var ConstStmt */ + protected $constant; + + /** @var Const_ */ + protected $node; + + /** + * Registers the Constant Statement and Node with this reflector. + * + * @param ConstStmt $stmt + * @param Const_ $node + */ + public function __construct( + ConstStmt $stmt, + Context $context, + Const_ $node + ) { + parent::__construct($node, $context); + $this->constant = $stmt; + } + + /** + * Returns the value contained in this Constant. + * + * @return string + */ + public function getValue() + { + return $this->getRepresentationOfValue($this->node->value); + } + + /** + * Returns the parsed DocBlock. + * + * @return DocBlock|null + */ + public function getDocBlock() + { + return $this->extractDocBlock($this->constant); + } +} diff --git a/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/Event/ExportDocBlockTagEvent.php b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/Event/ExportDocBlockTagEvent.php new file mode 100644 index 0000000..f6b754f --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/Event/ExportDocBlockTagEvent.php @@ -0,0 +1,55 @@ +xml; + } + + /** + * @return Tag|null + */ + public function getObject() + { + return $this->object; + } + + /** + * @param Tag $object + * + * @return ExportDocBlockTagEvent + */ + public function setObject(Tag $object = null) + { + $this->object = $object; + + return $this; + } + + /** + * @param DOMNode $xml + * + * @return ExportDocBlockTagEvent + */ + public function setXml(DOMNode $xml = null) + { + $this->xml = $xml; + + return $this; + } +} diff --git a/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/Event/PostDocBlockExtractionEvent.php b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/Event/PostDocBlockExtractionEvent.php new file mode 100644 index 0000000..897918f --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/Event/PostDocBlockExtractionEvent.php @@ -0,0 +1,31 @@ +docblock = $docblock; + + return $this; + } + + /** + * @return DocBlock|null + */ + public function getDocblock() + { + return $this->docblock; + } +} diff --git a/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/Exception.php b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/Exception.php new file mode 100644 index 0000000..9d9f78e --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/Exception.php @@ -0,0 +1,23 @@ + + * @copyright 2010-2012 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +namespace phpDocumentor\Reflection; + +/** + * An exception specifically originating from the Reflection component. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class Exception extends \Exception +{ +} diff --git a/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/Exception/UnparsableFile.php b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/Exception/UnparsableFile.php new file mode 100644 index 0000000..854de95 --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/Exception/UnparsableFile.php @@ -0,0 +1,25 @@ + + * @copyright 2010-2012 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\Exception; + +/** + * Exception representing any situation where the file is not parsable. + * + * @author Mike van Riel + * @copyright 2010-2012 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class UnparsableFile extends \phpDocumentor\Reflection\Exception +{ +} diff --git a/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/Exception/UnreadableFile.php b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/Exception/UnreadableFile.php new file mode 100644 index 0000000..93d61c5 --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/Exception/UnreadableFile.php @@ -0,0 +1,26 @@ + + * @copyright 2010-2012 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\Exception; + +/** + * Exception representing any error in the Reflection library due to a file not + * being readable or accessible. + * + * @author Mike van Riel + * @copyright 2010-2012 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class UnreadableFile extends \phpDocumentor\Reflection\Exception +{ +} diff --git a/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/FileReflector.php b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/FileReflector.php new file mode 100644 index 0000000..91ff73a --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/FileReflector.php @@ -0,0 +1,563 @@ + + * @copyright 2010-2012 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +use phpDocumentor\Event\Dispatcher; +use phpDocumentor\Parser\Event\LogEvent; +use phpDocumentor\Reflection\DocBlock; +use phpDocumentor\Reflection\DocBlock\Context; +use phpDocumentor\Reflection\DocBlock\Location; +use phpDocumentor\Reflection\Event\PostDocBlockExtractionEvent; +use phpDocumentor\Reflection\Exception; +use PhpParser\Node\Stmt\ClassMethod; +use Psr\Log\LogLevel; +use PhpParser\Comment\Doc; +use PhpParser\Node; +use PhpParser\Node\Const_; +use PhpParser\Node\Expr\FuncCall; +use PhpParser\Node\Expr\Include_; +use PhpParser\Node\Name; +use PhpParser\Node\Stmt\Class_; +use PhpParser\Node\Stmt\ClassConst; +use PhpParser\Node\Stmt\Const_ as ConstStmt; +use PhpParser\Node\Stmt\Function_; +use PhpParser\Node\Stmt\InlineHTML; +use PhpParser\Node\Stmt\Interface_; +use PhpParser\Node\Stmt\Property; +use PhpParser\Node\Stmt\PropertyProperty; +use PhpParser\Node\Stmt\Trait_; +use PhpParser\Node\Stmt\UseUse; +use PhpParser\NodeVisitor; + +/** + * Reflection class for a full file. + * + * @author Mike van Riel + * @copyright 2010-2012 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class FileReflector extends ReflectionAbstract implements NodeVisitor +{ + /** @var string An MD5 hashed representation of the contents of this file */ + protected $hash; + + /** @var string The contents of this file. */ + protected $contents = ''; + + /** @var IncludeReflector[] */ + protected $includes = array(); + + /** @var ConstantReflector[] */ + protected $constants = array(); + + /** @var ClassReflector[] */ + protected $classes = array(); + + /** @var TraitReflector[] */ + protected $traits = array(); + + /** @var InterfaceReflector[] */ + protected $interfaces = array(); + + /** @var FunctionReflector[] */ + protected $functions = array(); + + /** @var string The name of the file associated with this reflection object. */ + protected $filename = ''; + + /** @var DocBlock */ + protected $doc_block; + + /** @var string The package name that should be used if none is present in the file */ + protected $default_package_name = 'Default'; + + /** @var string[] A list of markers contained in this file. */ + protected $markers = array(); + + /** @var string[] A list of errors during processing */ + protected $parse_markers = array(); + + /** @var string[] A list of all marker types to search for in this file. */ + protected $marker_terms = array('TODO', 'FIXME'); + + /** @var Context */ + protected $context; + + /** + * Opens the file and retrieves its contents. + * + * During construction the given file is checked whether it is readable and + * if the $validate argument is true a PHP Lint action is executed to + * check whether the there are no parse errors. + * + * By default the Lint check is disabled because of the performance hit + * introduced by this action. + * + * If the validation checks out, the file's contents are read, converted to + * UTF-8 and the object is created from those contents. + * + * @param string $file Name of the file. + * @param boolean $validate Whether to check the file using PHP Lint. + * @param string $encoding The encoding of the file. + * + * @throws Exception\UnreadableFile If the filename is incorrect or + * the file cannot be opened + * @throws Exception\UnparsableFile If the file fails PHP lint checking + * (this can only happen when $validate is set to true) + */ + public function __construct($file, $validate = false, $encoding = 'utf-8') + { + if (!is_string($file) || (!is_readable($file))) { + throw new Exception\UnreadableFile( + 'The given file should be a string, should exist on the filesystem and should be readable' + ); + } + + if ($validate) { + exec('php -l ' . escapeshellarg($file), $output, $result); + if ($result != 0) { + throw new Exception\UnparsableFile( + 'The given file could not be interpreted as it contains errors: ' + . implode(PHP_EOL, $output) + ); + } + } + + $this->filename = $file; + $this->contents = file_get_contents($file); + $this->context = new Context(); + + if (strtolower($encoding) !== 'utf-8' && extension_loaded('iconv')) { + $this->contents = iconv( + strtolower($encoding), + 'utf-8//IGNORE//TRANSLIT', + $this->contents + ); + } + + // filemtime($file) is sometimes between 0.00001 and 0.00005 seconds + // faster but md5 is more accurate. It can also result in false + // positives or false negatives after copying or checking out a codebase. + $this->hash = md5($this->contents); + } + + public function process() + { + // with big fluent interfaces it can happen that PHP-Parser's Traverser + // exceeds the 100 recursions limit; we set it to 10000 to be sure. + ini_set('xdebug.max_nesting_level', 10000); + + $traverser = new Traverser(); + $traverser->addVisitor($this); + $traverser->traverse($this->contents); + + $this->scanForMarkers(); + } + + /** + * @return ClassReflector[] + */ + public function getClasses() + { + return $this->classes; + } + + /** + * @return TraitReflector[] + */ + public function getTraits() + { + return $this->traits; + } + + /** + * @return ConstantReflector[] + */ + public function getConstants() + { + return $this->constants; + } + + /** + * @return FunctionReflector[] + */ + public function getFunctions() + { + return $this->functions; + } + + /** + * @return IncludeReflector[] + */ + public function getIncludes() + { + return $this->includes; + } + + /** + * @return InterfaceReflector[] + */ + public function getInterfaces() + { + return $this->interfaces; + } + + public function beforeTraverse(array $nodes) + { + $node = null; + $key = 0; + foreach ($nodes as $k => $n) { + if (!$n instanceof InlineHTML) { + $node = $n; + $key = $k; + break; + } + } + + if ($node) { + $comments = (array) $node->getAttribute('comments'); + + // remove non-DocBlock comments + $comments = array_values( + array_filter( + $comments, + function ($comment) { + return $comment instanceof Doc; + } + ) + ); + + if (!empty($comments)) { + try { + $docblock = new DocBlock( + (string) $comments[0], + null, + new Location($comments[0]->getLine()) + ); + + // the first DocBlock in a file documents the file if + // * it precedes another DocBlock or + // * it contains a @package tag and doesn't precede a class + // declaration or + // * it precedes a non-documentable element (thus no include, + // require, class, function, define, const) + if (count($comments) > 1 + || (!$node instanceof Class_ + && !$node instanceof Interface_ + && $docblock->hasTag('package')) + || !$this->isNodeDocumentable($node) + ) { + $this->doc_block = $docblock; + + // remove the file level DocBlock from the node's comments + array_shift($comments); + } + } catch (\Exception $e) { + $this->log($e->getMessage(), LogLevel::CRITICAL); + } + } + + // always update the comments attribute so that standard comments + // do not stop DocBlock from being attached to an element + $node->setAttribute('comments', $comments); + $nodes[$key] = $node; + } + + if (class_exists('phpDocumentor\Event\Dispatcher')) { + Dispatcher::getInstance()->dispatch( + 'reflection.docblock-extraction.post', + PostDocBlockExtractionEvent + ::createInstance($this)->setDocblock($this->doc_block) + ); + } + + return $nodes; + } + + /** + * Checks whether the given node is recogized by phpDocumentor as a + * documentable element. + * + * The following elements are recognized: + * + * - Trait + * - Class + * - Interface + * - Class constant + * - Class method + * - Property + * - Include/Require + * - Constant, both const and define + * - Function + * + * @param Node $node + * + * @return bool + */ + protected function isNodeDocumentable(Node $node) + { + return ($node instanceof Class_) + || ($node instanceof Interface_) + || ($node instanceof ClassConst) + || ($node instanceof ClassMethod) + || ($node instanceof ConstStmt) + || ($node instanceof Function_) + || ($node instanceof Property) + || ($node instanceof PropertyProperty) + || ($node instanceof Trait_) + || ($node instanceof Include_) + || ($node instanceof FuncCall + && ($node->name instanceof Name) + && $node->name == 'define'); + } + + public function enterNode(Node $node) + { + } + + public function getName() + { + return $this->filename; + } + + public function getFilename() + { + return $this->filename; + } + + public function getHash() + { + return $this->hash; + } + + public function getDocBlock() + { + return $this->doc_block; + } + + public function getLineNumber() + { + return 0; + } + + public function getDefaultPackageName() + { + return $this->default_package_name; + } + + /** + * Adds a marker to scan the contents of this file for. + * + * @param string $name The Marker term, e.g. FIXME or TODO. + * + * @return void + */ + public function addMarker($name) + { + $this->marker_terms[] = $name; + } + + /** + * Sets a list of markers to search for. + * + * @param string[] $markers A list of marker terms to scan for. + * + * @see phpDocumentor\Reflection\FileReflector::addMarker() + * + * @return void + */ + public function setMarkers(array $markers) + { + $this->marker_terms = array(); + + foreach ($markers as $marker) { + $this->addMarker($marker); + } + } + + public function getMarkers() + { + return $this->markers; + } + + /** + * Adds a parse error to the system + * + * @param LogEvent $data Contains the type, + * message, line and code element. + * + * @return void + */ + public function addParserMarker($data) + { + $this->parse_markers[] = array( + $data->getType(), + $data->getMessage(), + $data->getLine(), + $data->getCode() + ); + } + + /** + * Scans the file for markers and records them in the markers property. + * + * @see getMarkers() + * + * @todo this method may incur a performance penalty while the AST also + * contains the comments. This method should be replaced by a piece of + * code that interprets the comments in the AST. + * This has not been done since that may be an extensive refactoring (each + * PhpParser\Node* contains a 'comments' attribute and must thus recursively + * be discovered) + * + * @return void + */ + public function scanForMarkers() + { + // find all markers, get the entire file and check for marker terms. + $marker_data = array(); + foreach (explode("\n", $this->contents) as $line_number => $line) { + preg_match_all( + '~//[\s]*(' . implode('|', $this->marker_terms) . ')\:?[\s]*(.*)~', + $line, + $matches, + PREG_SET_ORDER + ); + foreach ($matches as &$match) { + $match[3] = $line_number + 1; + } + $marker_data = array_merge($marker_data, $matches); + } + + // store marker results and remove first entry (entire match), + // this results in an array with 2 entries: + // marker name and content + $this->markers = $marker_data; + foreach ($this->markers as &$marker) { + array_shift($marker); + } + } + + public function getParseErrors() + { + return $this->parse_markers; + } + + public function getNamespace() + { + return $this->context->getNamespace(); + } + + public function getNamespaceAliases() + { + return $this->context->getNamespaceAliases(); + } + + public function getContents() + { + return $this->contents; + } + + public function setDefaultPackageName($default_package_name) + { + $this->default_package_name = $default_package_name; + } + + public function setFilename($filename) + { + $this->filename = $filename; + } + + public function leaveNode(Node $node) + { + $prettyPrinter = new PrettyPrinter; + + switch (get_class($node)) { + case 'PhpParser\Node\Stmt\Use_': + /** @var \PhpParser\Node\Stmt\UseUse $use */ + foreach ($node->uses as $use) { + $this->context->setNamespaceAlias( + $use->alias, + implode('\\', $use->name->parts) + ); + } + break; + case 'PhpParser\Node\Stmt\Namespace_': + $this->context->setNamespace( + isset($node->name) && ($node->name) ? implode('\\', $node->name->parts) : '' + ); + break; + case 'PhpParser\Node\Stmt\Class_': + $class = new ClassReflector($node, $this->context); + $class->parseSubElements(); + $this->classes[] = $class; + break; + case 'PhpParser\Node\Stmt\Trait_': + $trait = new TraitReflector($node, $this->context); + $trait->parseSubElements(); + $this->traits[] = $trait; + break; + case 'PhpParser\Node\Stmt\Interface_': + $interface = new InterfaceReflector($node, $this->context); + $interface->parseSubElements(); + $this->interfaces[] = $interface; + break; + case 'PhpParser\Node\Stmt\Function_': + $function = new FunctionReflector($node, $this->context); + $this->functions[] = $function; + break; + case 'PhpParser\Node\Stmt\Const_': + foreach ($node->consts as $constant) { + $reflector = new ConstantReflector( + $node, + $this->context, + $constant + ); + $this->constants[] = $reflector; + } + break; + case 'PhpParser\Node\Expr\FuncCall': + if (($node->name instanceof Name) + && ($node->name == 'define') + && isset($node->args[0]) + && isset($node->args[1]) + ) { + // transform the first argument of the define function call into a constant name + $name = str_replace( + array('\\\\', '"', "'"), + array('\\', '', ''), + trim($prettyPrinter->prettyPrintExpr($node->args[0]->value), '\'') + ); + $nameParts = explode('\\', $name); + $shortName = end($nameParts); + + $constant = new Const_($shortName, $node->args[1]->value, $node->getAttributes()); + $constant->namespacedName = new Name($name); + + $constant_statement = new ConstStmt(array($constant)); + $constant_statement->setAttribute('comments', array($node->getDocComment())); + $this->constants[] = new ConstantReflector($constant_statement, $this->context, $constant); + } + break; + case 'PhpParser\Node\Expr\Include_': + $include = new IncludeReflector($node, $this->context); + $this->includes[] = $include; + break; + } + } + + public function afterTraverse(array $nodes) + { + } +} diff --git a/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/FunctionReflector.php b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/FunctionReflector.php new file mode 100644 index 0000000..95a673a --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/FunctionReflector.php @@ -0,0 +1,76 @@ + + * @copyright 2010-2012 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +use phpDocumentor\Reflection\BaseReflector; +use phpDocumentor\Reflection\DocBlock\Context; +use PhpParser\Node\Param; +use PhpParser\Node\Stmt; +use PhpParser\Node\Stmt\Function_; + +/** + * Provides Static Reflection for functions. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class FunctionReflector extends BaseReflector +{ + /** @var \PhpParser\Node\Stmt\Function_ */ + protected $node; + + /** @var FunctionReflector\ArgumentReflector[] */ + protected $arguments = array(); + + /** + * Initializes the reflector using the function statement object of + * PHP-Parser. + * + * @param \PhpParser\Node\Stmt $node Function object coming from PHP-Parser. + * @param Context $context The context in which the node occurs. + */ + public function __construct(\PhpParser\Node\Stmt $node, Context $context) + { + parent::__construct($node, $context); + + /** @var \PhpParser\Node\Param $param */ + foreach ($node->params as $param) { + $reflector = new FunctionReflector\ArgumentReflector( + $param, + $context + ); + $this->arguments[$reflector->getName()] = $reflector; + } + } + + /** + * Checks whether the function returns a value by reference. + * + * @return bool TRUE if the return value is by reference, FALSE otherwise. + */ + public function isByRef() + { + return $this->node->byRef; + } + + /** + * Returns a list of Argument objects. + * + * @return FunctionReflector\ArgumentReflector[] + */ + public function getArguments() + { + return $this->arguments; + } +} diff --git a/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/FunctionReflector/ArgumentReflector.php b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/FunctionReflector/ArgumentReflector.php new file mode 100644 index 0000000..0f1bfcb --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/FunctionReflector/ArgumentReflector.php @@ -0,0 +1,75 @@ + + * @copyright 2010-2012 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\FunctionReflector; + +use phpDocumentor\Reflection\BaseReflector; +use PhpParser\Node\Param; + +class ArgumentReflector extends BaseReflector +{ + /** @var Param */ + protected $node; + + /** + * Checks whether the argument is passed by reference. + * + * @return bool TRUE if the argument is by reference, FALSE otherwise. + */ + public function isByRef() + { + return $this->node->byRef; + } + + /** + * Returns the default value or null is none is set. + * + * @return string|null + */ + public function getDefault() + { + $result = null; + if ($this->node->default) { + $result = $this->getRepresentationOfValue($this->node->default); + } + + return $result; + } + + /** + * Returns the typehint, or null if none is set. + * + * @return string|null + */ + public function getType() + { + if ( $this->node->type instanceof \PhpParser\Node\NullableType ) { + return "?{$this->node->type->type}"; + } + + $type = (string) $this->node->type; + + // in case of the callable of array keyword; do not prefix with a \ + if ($type == 'callable' || $type == 'array' + || $type == 'self' || $type == '$this' + ) { + return $type; + } + + return $type ? '\\'.$type : ''; + } + + public function getName() + { + return '$'.parent::getName(); + } +} diff --git a/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/IncludeReflector.php b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/IncludeReflector.php new file mode 100644 index 0000000..4360366 --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/IncludeReflector.php @@ -0,0 +1,74 @@ + + * @copyright 2010-2012 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +use Exception; +use PhpParser\Node\Expr\Include_; + +class IncludeReflector extends BaseReflector +{ + /** @var Include_ */ + protected $node; + + /** + * Returns the type of this include. + * + * Valid types are: + * - Include + * - Include Once + * - Require + * - Require Once + * + * @throws Exception if the include is of an unknown type + * + * @return string + */ + public function getType() + { + switch ($this->node->type) { + case Include_::TYPE_INCLUDE: + return 'Include'; + case Include_::TYPE_INCLUDE_ONCE: + return 'Include Once'; + case Include_::TYPE_REQUIRE: + return 'Require'; + case Include_::TYPE_REQUIRE_ONCE: + return 'Require Once'; + default: + throw new Exception( + 'Unknown include type detected: '.$this->node->type + ); + } + } + + public function getShortName() + { + if ( ! isset( $this->node->expr->value ) ) { + $name = []; + foreach ( $this->node->expr->getSubNodeNames() as $part ) { + $thing = $this->node->expr->{$part}; + + $name[] = ( is_object( $thing ) && method_exists( $thing, 'getName' ) ) + ? $thing->getName() + : ( ( is_array( $thing ) + ? array_key_exists( 'value', $thing ) + : property_exists( $thing, 'value' ) + ) + ? $thing->value + : '(unknown)' ); + } + $name = implode( ' . ', $name ); + } + return (string) $this->node->expr->value; + } +} diff --git a/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/InterfaceReflector.php b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/InterfaceReflector.php new file mode 100644 index 0000000..e32bdc0 --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/InterfaceReflector.php @@ -0,0 +1,118 @@ + + * @copyright 2010-2012 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +use PhpParser\Node\Name; +use PhpParser\Node\Stmt\Class_; +use PhpParser\Node\Stmt\Interface_; + +class InterfaceReflector extends BaseReflector +{ + /** @var Interface_|\PhpParser\Node\Stmt\Class_ */ + protected $node; + + /** + * @var ClassReflector\ConstantReflector[] + */ + protected $constants = array(); + /** + * @var ClassReflector\PropertyReflector[] + */ + protected $properties = array(); + /** + * @var ClassReflector\MethodReflector[] + */ + protected $methods = array(); + + public function parseSubElements() + { + foreach ($this->node->stmts as $stmt) { + switch (get_class($stmt)) { + case 'PhpParser\Node\Stmt\Property': + foreach ($stmt->props as $property) { + $this->properties[] = new ClassReflector\PropertyReflector( + $stmt, + $this->context, + $property + ); + } + break; + case 'PhpParser\Node\Stmt\ClassMethod': + $this->methods[strtolower($stmt->name)] = new ClassReflector\MethodReflector( + $stmt, + $this->context + ); + break; + case 'PhpParser\Node\Stmt\ClassConst': + foreach ($stmt->consts as $constant) { + $this->constants[] = new ClassReflector\ConstantReflector( + $stmt, + $this->context, + $constant + ); + } + break; + } + } + } + + public function getParentInterfaces() + { + $names = array(); + if ($this->node instanceof Interface_ + && $this->node->extends + ) { + /** @var Name */ + foreach ($this->node->extends as $node) { + $names[] = '\\'.(string) $node; + } + } + + return $names; + } + + /** + * @return ClassReflector\ConstantReflector[] + */ + public function getConstants() + { + return $this->constants; + } + + /** + * @return ClassReflector\PropertyReflector[] + */ + public function getProperties() + { + return $this->properties; + } + + /** + * @return ClassReflector\MethodReflector[] + */ + public function getMethods() + { + return $this->methods; + } + + /** + * @param string $name the method name + * @return ClassReflector\MethodReflector|null + */ + public function getMethod($name) + { + $name = strtolower($name); + + return isset($this->methods[$name]) ? $this->methods[$name] : null; + } +} diff --git a/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/Lexer.php b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/Lexer.php new file mode 100644 index 0000000..09a4ff0 --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/Lexer.php @@ -0,0 +1,74 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +use PhpParser\Lexer as BaseLexer; +use PhpParser\Parser; + +/** + * Custom lexer for phpDocumentor. + * + * phpDocumentor has a custom Lexer for PHP-Parser because it needs + * unmodified value for Scalar variables instead of an interpreted version. + * + * If the interpreted version was to be used then the XML interpretation would + * fail because of special characters. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class Lexer extends BaseLexer +{ + /** + * Retrieves the next token and determines the associated attributes and + * returns the token id. + * + * @param string $value + * @param string[] $startAttributes + * @param string[] $endAttributes + * + * @return int + */ + public function getNextToken( + &$value = null, + &$startAttributes = null, + &$endAttributes = null + ) { + $tokenId = parent::getNextToken($value, $startAttributes, $endAttributes); + + if ($this->isTokenScalar($tokenId)) { + // store original value because the value itself will be interpreted + // by PHP_Parser and we want the unformatted value + $endAttributes['originalValue'] = $value; + } + + return $tokenId; + } + + /** + * Returns whether the given token id is a scalar that will be interpreted + * by PHP-Parser. + * + * @param int $tokenId The id to check, must match a \PhpParser_Parser::T_* + * constant. + * + * @return bool + */ + protected function isTokenScalar($tokenId) + { + return $tokenId == Parser::T_CONSTANT_ENCAPSED_STRING + || $tokenId == Parser::T_LNUMBER + || $tokenId == Parser::T_DNUMBER; + } +} diff --git a/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/PrettyPrinter.php b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/PrettyPrinter.php new file mode 100644 index 0000000..c99f456 --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/PrettyPrinter.php @@ -0,0 +1,57 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +use PhpParser\Node\Scalar\String_; + +/** + * Custom PrettyPrinter for phpDocumentor. + * + * phpDocumentor has a custom PrettyPrinter for PHP-Parser because it needs the + * unmodified value for Scalar variables instead of an interpreted version. + * + * If the interpreted version was to be used then the XML interpretation would + * fail because of special characters. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class PrettyPrinter extends \PhpParser\PrettyPrinter\Standard +{ + /** + * Converts the string into it's original representation without converting + * the special character combinations. + * + * This method is overridden from the original Zend Pretty Printer because + * the original returns the strings as interpreted by PHP-Parser. + * Since we do not want such conversions we take the original that is + * injected by our own custom Lexer. + * + * @param String $node The node to return a string + * representation of. + * + * @see Lexer where the originalValue is injected. + * + * @return string + */ + public function pScalar_String(String_ $node) + { + if (method_exists($this, 'pSafe')) { + return $this->pSafe($node->getAttribute('originalValue')); + } + + return $this->pNoIndent($node->getAttribute('originalValue')); + } + +} diff --git a/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/ReflectionAbstract.php b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/ReflectionAbstract.php new file mode 100644 index 0000000..871ed3a --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/ReflectionAbstract.php @@ -0,0 +1,72 @@ + + * @copyright 2012 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +use phpDocumentor\Event\DebugEvent; +use phpDocumentor\Event\Dispatcher; +use phpDocumentor\Event\LogEvent; + +/** + * Provides basic event logging and dispatching for every reflection class. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +abstract class ReflectionAbstract +{ + /** + * The context (namespace, aliases) for the reflection. + * + * @var \phpDocumentor\Reflection\DocBlock\Context + */ + protected $context = null; + + /** + * Dispatches a logging request. + * + * @param string $message The message to log. + * @param int $priority The logging priority, the lower, + * the more important. Ranges from 1 to 7 + * + * @return void + */ + public function log($message, $priority = 6) + { + if (class_exists('phpDocumentor\Event\Dispatcher')) { + Dispatcher::getInstance()->dispatch( + 'system.log', + LogEvent::createInstance($this) + ->setMessage($message)->setPriority($priority) + ); + } + } + + /** + * Dispatches a logging request to log a debug message. + * + * @param string $message The message to log. + * + * @return void + */ + public function debug($message) + { + if (class_exists('phpDocumentor\Event\Dispatcher')) { + Dispatcher::getInstance()->dispatch( + 'system.debug', + DebugEvent::createInstance($this) + ->setMessage($message) + ); + } + } +} diff --git a/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/TraitReflector.php b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/TraitReflector.php new file mode 100644 index 0000000..1c5a46c --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/TraitReflector.php @@ -0,0 +1,19 @@ + + * @copyright 2010-2012 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +class TraitReflector extends ClassReflector +{ + /** @var \PhpParser\Node\Stmt\Trait_ */ + protected $node; +} diff --git a/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/Traverser.php b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/Traverser.php new file mode 100644 index 0000000..abcd8bb --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/src/phpDocumentor/Reflection/Traverser.php @@ -0,0 +1,101 @@ + + * @copyright 2010-2012 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +use PhpParser\Error; +use PhpParser\NodeVisitor\NameResolver; +use PhpParser\Parser; +use PhpParser\ParserFactory; +use PhpParser\NodeTraverser; +use PhpParser\NodeVisitor; +use PhpParser\NodeVisitorAbstract; + +/** + * The source code traverser that scans the given source code and transforms + * it into tokens. + * + * @author Mike van Riel + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class Traverser +{ + /** + * List of visitors to apply upon traversing. + * + * @see traverse() + * + * @var \PhpParser\NodeVisitorAbstract[] + */ + public $visitors = array(); + + /** + * Traverses the given contents and builds an AST. + * + * @param string $contents The source code of the file that is to be scanned + * + * @return void + */ + public function traverse($contents) + { + try { + $this->createTraverser()->traverse( + $this->createParser()->parse($contents) + ); + } catch (Error $e) { + echo 'Parse Error: ', $e->getMessage(); + } + } + + /** + * Adds a visitor object to the traversal process. + * + * With visitors it is possible to extend the traversal process and + * modify the found tokens. + * + * @param \PhpParser\NodeVisitor $visitor + * + * @return void + */ + public function addVisitor(\PhpParser\NodeVisitor $visitor) + { + $this->visitors[] = $visitor; + } + + /** + * Creates a parser object using our own Lexer. + * + * @return Parser + */ + protected function createParser() + { + return (new ParserFactory)->create(ParserFactory::PREFER_PHP7); + } + + /** + * Creates a new traverser object and adds visitors. + * + * @return NodeTraverser + */ + protected function createTraverser() + { + $node_traverser = new NodeTraverser(true); + $node_traverser->addVisitor(new NameResolver()); + + foreach ($this->visitors as $visitor) { + $node_traverser->addVisitor($visitor); + } + + return $node_traverser; + } +} diff --git a/vendor-packages/phpdocumentor-reflection/tests/mocks/phpDocumentor/Reflection/BaseReflectorMock.php b/vendor-packages/phpdocumentor-reflection/tests/mocks/phpDocumentor/Reflection/BaseReflectorMock.php new file mode 100644 index 0000000..f5aaf06 --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/tests/mocks/phpDocumentor/Reflection/BaseReflectorMock.php @@ -0,0 +1,51 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +namespace phpDocumentor\Reflection; + +use PhpParser\Node\Expr; + +/** + * Class for testing base reflector. + * + * Extends the baseReflector so properties and abstract methods can be mocked, + * and therefore tested. + * + * @author Erik Baars + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class BaseReflectorMock extends BaseReflector +{ + /** + * Overload method so we can test the protected method + * + * @param Expr $value + * + * @return string + */ + public function getRepresentationOfValueMock( + Expr $value = null + ) { + return parent::getRepresentationOfValue($value); + } + + /** + * @param $val + * + * @return void + */ + public function setPrettyPrinter($val) + { + self::$prettyPrinter = $val; + } +} diff --git a/vendor-packages/phpdocumentor-reflection/tests/mocks/phpDocumentor/Reflection/ClassReflectorMock.php b/vendor-packages/phpdocumentor-reflection/tests/mocks/phpDocumentor/Reflection/ClassReflectorMock.php new file mode 100644 index 0000000..a44314b --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/tests/mocks/phpDocumentor/Reflection/ClassReflectorMock.php @@ -0,0 +1,31 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +namespace phpDocumentor\Reflection; + +/** + * Class for testing ClassReflector. + * + * Extends the ClassReflector so properties and abstract methods can be mocked, + * and therefore tested. + * + * @author Erik Baars + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class ClassReflectorMock extends ClassReflector +{ + public function setTraits(array $val) + { + $this->traits = $val; + } +} diff --git a/vendor-packages/phpdocumentor-reflection/tests/mocks/phpDocumentor/Reflection/NodeExprMock.php b/vendor-packages/phpdocumentor-reflection/tests/mocks/phpDocumentor/Reflection/NodeExprMock.php new file mode 100644 index 0000000..777ec56 --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/tests/mocks/phpDocumentor/Reflection/NodeExprMock.php @@ -0,0 +1,29 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +namespace phpDocumentor\Reflection; + +use PhpParser\Node\Expr; + +/** + * Class for testing PhpParser_Node_Expr. + * + * Extends the PhpParser_Node_Expr so properties and abstract methods can be mocked, + * and therefore tested. + * + * @author Vasil Rangelov + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class NodeExprMock extends Expr +{ +} diff --git a/vendor-packages/phpdocumentor-reflection/tests/mocks/phpDocumentor/Reflection/NodeStmtMock.php b/vendor-packages/phpdocumentor-reflection/tests/mocks/phpDocumentor/Reflection/NodeStmtMock.php new file mode 100644 index 0000000..c085741 --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/tests/mocks/phpDocumentor/Reflection/NodeStmtMock.php @@ -0,0 +1,40 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +namespace phpDocumentor\Reflection; + +use PhpParser\Node\Stmt; + +/** + * Class for testing PhpParser_Node_Stmt. + * + * Extends the PhpParser_Node_Stmt so properties and abstract methods can be mocked, + * and therefore tested. + * + * @author Erik Baars + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class NodeStmtMock extends \PhpParser\Node\Stmt +{ + public $name = null; + + public function setName($val) + { + $this->name = $val; + } + + public function __toString() + { + return 'testNodeMock'; + } +} diff --git a/vendor-packages/phpdocumentor-reflection/tests/mocks/phpDocumentor/Reflection/NodeStmtMock2.php b/vendor-packages/phpdocumentor-reflection/tests/mocks/phpDocumentor/Reflection/NodeStmtMock2.php new file mode 100644 index 0000000..7a32cec --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/tests/mocks/phpDocumentor/Reflection/NodeStmtMock2.php @@ -0,0 +1,34 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +namespace phpDocumentor\Reflection; + +use PhpParser\Node\Stmt; + +/** + * Class for testing PhpParser_Node_Stmt. + * + * Extends the PhpParser_Node_Stmt so properties and abstract methods can be mocked, + * and therefore tested. + * + * @author Erik Baars + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class NodeStmtMock2 extends Stmt +{ + public $type = null; + + public $implements = array(); + + public $extends = null; +} diff --git a/vendor-packages/phpdocumentor-reflection/tests/unit/phpDocumentor/Reflection/BaseReflectorTest.php b/vendor-packages/phpdocumentor-reflection/tests/unit/phpDocumentor/Reflection/BaseReflectorTest.php new file mode 100644 index 0000000..abe2ad2 --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/tests/unit/phpDocumentor/Reflection/BaseReflectorTest.php @@ -0,0 +1,272 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +namespace phpDocumentor\Reflection; + +use phpDocumentor\Reflection\DocBlock\Context; +use PHPUnit_Framework_TestCase; + +/** + * Class for testing base reflector. + * + * @author Erik Baars + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class BaseReflectorTest extends PHPUnit_Framework_TestCase +{ + /** + * Tests the setNameSpace method + * + * @covers \phpDocumentor\Reflection\BaseReflector::setNameSpace + * @covers \phpDocumentor\Reflection\BaseReflector::getNameSpace + * + * @return void + */ + public function testSetNameSpace() + { + /** @var BaseReflector $base_reflector */ + $base_reflector = new BaseReflectorMock( + $this->getMockBuilder('\PhpParser\Node\Stmt')->disableOriginalConstructor()->getMock(), + new Context() + ); + $base_reflector->setNamespace('namespace_name'); + + $this->assertEquals('namespace_name', $base_reflector->getNameSpace()); + } + + /** + * Tests the setNameSpace method when an invalid argument is passed + * + * @covers \phpDocumentor\Reflection\BaseReflector::setNameSpace + * + * @expectedException \InvalidArgumentException + * + * @return void + */ + public function testSetNameSpaceInvalidArgument() + { + /** @var BaseReflector $base_reflector */ + $base_reflector = new BaseReflectorMock( + $this->getMockBuilder('\PhpParser\Node\Stmt')->disableOriginalConstructor()->getMock(), + new Context() + ); + $base_reflector->setNamespace(null); + } + + /** + * Tests the getDocblock method + * + * @covers \phpDocumentor\Reflection\BaseReflector::getDocBlock + * + * @return void + */ + public function testGetDocBlock() + { + $this->markTestIncomplete(); + } + + /** + * Tests the getName method + * + * @covers \phpDocumentor\Reflection\BaseReflector::getName + * + * @return void + */ + public function testGetName() + { + $this->markTestIncomplete(); + } + + /** + * Tests the getShortName method + * + * @covers \phpDocumentor\Reflection\BaseReflector::getShortName + * + * @return void + */ + public function testGetShortName() + { + $node = new NodeStmtMock(); + $base_reflector = new BaseReflectorMock( + $node, + new Context() + ); + + $this->assertEquals($node->__toString(), $base_reflector->getShortName()); + + $node->setName('test_name'); + + $this->assertEquals('test_name', $base_reflector->getShortName()); + } + + /** + * Tests the getNameSpaceAlias method + * + * @covers \phpDocumentor\Reflection\BaseReflector::getNamespaceAliases + * @covers \phpDocumentor\Reflection\BaseReflector::setNamespaceAliases + * + * @return void + */ + public function testGetNamespaceAliases() + { + $node = new NodeStmtMock(); + $base_reflector = new BaseReflectorMock( + $node, + new Context() + ); + + $this->assertEquals(array(), $base_reflector->getNamespaceAliases()); + + $base_reflector->setNamespaceAliases( + array('test_namespace', 'test_namespace_2') + ); + + $this->assertCount(2, $base_reflector->getNamespaceAliases()); + $this->assertEquals( + array('\test_namespace', '\test_namespace_2'), + $base_reflector->getNamespaceAliases() + ); + } + + /** + * Tests the getNameSpaceAlias method + * + * Tests the following scenarios: + * - no namespace aliases set yet + * - overwrite the current namespace alias + * - add another namespace alias without overwriting the already set alias + * + * @covers \phpDocumentor\Reflection\BaseReflector::getNamespaceAliases + * @covers \phpDocumentor\Reflection\BaseReflector::setNamespaceAlias + * + * @return void + */ + public function testsetNamespaceAlias() + { + $node = new NodeStmtMock(); + + $base_reflector = new BaseReflectorMock( + $node, + new Context() + ); + + $this->assertEquals(array(), $base_reflector->getNamespaceAliases()); + + $base_reflector->setNamespaceAlias('test_alias', 'test_namespace'); + + $namespace_aliases = $base_reflector->getNamespaceAliases(); + $this->assertCount(1, $namespace_aliases); + $this->assertArrayHasKey('test_alias', $namespace_aliases); + $this->assertEquals('\test_namespace', $namespace_aliases['test_alias']); + + $base_reflector->setNamespaceAlias('test_alias', 'test_namespace_2'); + + $namespace_aliases = $base_reflector->getNamespaceAliases(); + $this->assertCount(1, $namespace_aliases); + $this->assertArrayHasKey('test_alias', $namespace_aliases); + $this->assertEquals('\test_namespace_2', $namespace_aliases['test_alias']); + + $base_reflector->setNamespaceAlias('test_alias2', 'test_namespace'); + + $namespace_aliases = $base_reflector->getNamespaceAliases(); + $this->assertCount(2, $namespace_aliases); + $this->assertArrayHasKey('test_alias', $namespace_aliases); + $this->assertArrayHasKey('test_alias2', $namespace_aliases); + $this->assertEquals('\test_namespace_2', $namespace_aliases['test_alias']); + $this->assertEquals('\test_namespace', $namespace_aliases['test_alias2']); + } + + /** + * Tests the getLinenumber method + * + * @covers \phpDocumentor\Reflection\BaseReflector::getLinenumber + * + * @return void + */ + public function testGetLinenumber() + { + $node = new NodeStmtMock(); + + $base_reflector = new BaseReflectorMock( + $node, + new Context() + ); + + $this->assertEquals($node->getLine(), $base_reflector->getLinenumber()); + + $node->setLine(123); + + $this->assertEquals(123, $base_reflector->getLinenumber()); + } + + /** + * Tests the setDefaultPackageName method + * + * @covers \phpDocumentor\Reflection\BaseReflector::setDefaultPackageName + * @covers \phpDocumentor\Reflection\BaseReflector::getDefaultPackageName + * + * @return void + */ + public function testSetDefaultPackageName() + { + $node = new NodeStmtMock(); + + $base_reflector = new BaseReflectorMock( + $node, + new Context() + ); + + $this->assertInternalType( + 'string', + $base_reflector->getDefaultPackageName() + ); + $this->assertEquals('', $base_reflector->getDefaultPackageName()); + + $base_reflector->setDefaultPackageName('test_name'); + + $this->assertEquals('test_name', $base_reflector->getDefaultPackageName()); + } + + /** + * Tests the setDefaultPackageName method + * + * @covers \phpDocumentor\Reflection\BaseReflector::getRepresentationOfValue + * + * @return void + */ + public function testGetRepresentationOfValue() + { + $node = new NodeStmtMock(); + $base_reflector = new BaseReflectorMock( + $node, + new Context() + ); + + $this->assertEquals('', $base_reflector->getRepresentationOfValueMock(null)); + + $pretty_printer = $this->getMock( + '\phpDocumentor\Reflection\PrettyPrinter', + array('prettyPrintExpr') + ); + $base_reflector->setPrettyPrinter($pretty_printer); + $pretty_printer + ->expects($this->once()) + ->method('prettyPrintExpr') + ->will($this->returnValue('test_output')); + + $this->assertEquals( + 'test_output', + $base_reflector->getRepresentationOfValueMock(new NodeExprMock()) + ); + } +} diff --git a/vendor-packages/phpdocumentor-reflection/tests/unit/phpDocumentor/Reflection/ClassReflectorTest.php b/vendor-packages/phpdocumentor-reflection/tests/unit/phpDocumentor/Reflection/ClassReflectorTest.php new file mode 100644 index 0000000..76b9b2b --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/tests/unit/phpDocumentor/Reflection/ClassReflectorTest.php @@ -0,0 +1,182 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +namespace phpDocumentor\Reflection; + +use phpDocumentor\Reflection\DocBlock\Context; +use PhpParser\Node\Stmt\Class_; +use PhpParser\Node\Stmt\ClassMethod; +use PHPUnit_Framework_TestCase; + +/** + * Class for testing ClassReflector. + * + * @author Erik Baars + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class ClassReflectorTest extends PHPUnit_Framework_TestCase +{ + /** + * Tests the parseSubElements method + * + * @covers \phpDocumentor\Reflection\ClassReflector::parseSubElements + * + * @return void + */ + public function testParseSubElements() + { + $this->markTestIncomplete(); + } + + /** + * Tests the parseSubElements method + * + * @covers \phpDocumentor\Reflection\ClassReflector::isAbstract + * + * @return void + */ + public function testIsAbstract() + { + //$this->markTestSkipped(); + $node = new NodeStmtMock2(); + $class_reflector = new ClassReflector( + $node, + new Context() + ); + + $this->assertFalse($class_reflector->isAbstract()); + + $node->type = Class_::MODIFIER_ABSTRACT; + $this->assertTrue($class_reflector->isAbstract()); + } + + /** + * Tests the parseSubElements method + * + * @covers \phpDocumentor\Reflection\ClassReflector::isFinal + * + * @return void + */ + public function testIsFinal() + { + $node = new NodeStmtMock2(); + $class_reflector = new ClassReflector( + $node, + new Context() + ); + + $this->assertFalse($class_reflector->isFinal()); + + $node->type = Class_::MODIFIER_FINAL; + $this->assertTrue($class_reflector->isFinal()); + } + + /** + * Tests the parseSubElements method + * + * @covers \phpDocumentor\Reflection\ClassReflector::getTraits + * + * @return void + */ + public function testGetTraits() + { + $node = new NodeStmtMock(); + $class_reflector = new ClassReflectorMock( + $node, + new Context() + ); + + $traits = $class_reflector->getTraits(); + $this->assertInternalType('array', $traits); + $this->assertEmpty($traits); + + $class_reflector->setTraits(array('trait1', 'trait2')); + $traits = $class_reflector->getTraits(); + + $this->assertCount(2, $traits); + $this->assertEquals('trait1', reset($traits)); + } + + /** + * Tests the parseSubElements method + * + * @covers \phpDocumentor\Reflection\ClassReflector::getParentClass + * + * @return void + */ + public function testGetParentClass() + { + $node = new NodeStmtMock(); + $class_reflector = new ClassReflectorMock( + $node, + new Context() + ); + + $this->assertEquals('', $class_reflector->getParentClass()); + + $node->extends = 'dummy'; + + $this->assertEquals('\dummy', $class_reflector->getParentClass()); + } + + /** + * Tests the parseSubElements method + * + * @covers \phpDocumentor\Reflection\ClassReflector::getInterfaces + * + * @return void + */ + public function testGetInterfaces() + { + $node = new NodeStmtMock(); + $class_reflector = new ClassReflectorMock( + $node, + new Context() + ); + + $this->assertEquals(array(), $class_reflector->getInterfaces()); + + $node->implements = array('dummy'); + + $this->assertEquals(array('\dummy'), $class_reflector->getInterfaces()); + } + + /** + * Tests the getMethod method + * + * @covers \phpDocumentor\Reflection\ClassReflector::getMethod + * + * @return void + */ + public function testGetMethod() + { + $node = new NodeStmtMock(); + $node->stmts = array(new ClassMethod('someMethod')); + $class_reflector = new ClassReflectorMock( + $node, + new Context() + ); + + // Before parseSubElements + $this->assertNull($class_reflector->getMethod('someMethod')); + + $class_reflector->parseSubElements(); + + // After parseSubElements + $this->assertInstanceOf( + '\phpDocumentor\Reflection\ClassReflector\MethodReflector', + $class_reflector->getMethod('someMethod') + ); + $this->assertNull($class_reflector->getMethod('someOtherMethod')); + } +} diff --git a/vendor-packages/phpdocumentor-reflection/tests/unit/phpDocumentor/Reflection/PrettyPrinterTest.php b/vendor-packages/phpdocumentor-reflection/tests/unit/phpDocumentor/Reflection/PrettyPrinterTest.php new file mode 100644 index 0000000..434be7c --- /dev/null +++ b/vendor-packages/phpdocumentor-reflection/tests/unit/phpDocumentor/Reflection/PrettyPrinterTest.php @@ -0,0 +1,45 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +namespace phpDocumentor\Reflection; + +use PhpParser\Node\Scalar\String_; +use PHPUnit_Framework_TestCase; + +/** + * Class for testing the PrettyPrinter. + * + * @author Vasil Rangelov + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ +class PrettyPrinterTest extends PHPUnit_Framework_TestCase +{ + /** + * @covers \phpDocumentor\Reflection\PrettyPrinter::pScalar_String + * + * @return void + */ + public function testScalarStringPrinting() + { + $object = new PrettyPrinter(); + $this->assertEquals( + 'Another value', + $object->pScalar_String( + new String_( + 'Value', + array('originalValue' => 'Another value') + ) + ) + ); + } +}