Barbara Pitt
3 years ago
1347 changed files with 118161 additions and 0 deletions
@ -0,0 +1,5 @@ |
|||
{ |
|||
"require": { |
|||
"phpunit/phpunit": "^5" |
|||
} |
|||
} |
File diff suppressed because it is too large
@ -0,0 +1,7 @@ |
|||
<?php |
|||
|
|||
// autoload.php @generated by Composer |
|||
|
|||
require_once __DIR__ . '/composer/autoload_real.php'; |
|||
|
|||
return ComposerAutoloaderInit1eb0bd8b9bd803db01b2c2a0cd8b9817::getLoader(); |
@ -0,0 +1 @@ |
|||
../phpunit/phpunit/phpunit |
@ -0,0 +1,445 @@ |
|||
<?php |
|||
|
|||
/* |
|||
* This file is part of Composer. |
|||
* |
|||
* (c) Nils Adermann <naderman@naderman.de> |
|||
* Jordi Boggiano <j.boggiano@seld.be> |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
*/ |
|||
|
|||
namespace Composer\Autoload; |
|||
|
|||
/** |
|||
* ClassLoader implements a PSR-0, PSR-4 and classmap class loader. |
|||
* |
|||
* $loader = new \Composer\Autoload\ClassLoader(); |
|||
* |
|||
* // register classes with namespaces |
|||
* $loader->add('Symfony\Component', __DIR__.'/component'); |
|||
* $loader->add('Symfony', __DIR__.'/framework'); |
|||
* |
|||
* // activate the autoloader |
|||
* $loader->register(); |
|||
* |
|||
* // to enable searching the include path (eg. for PEAR packages) |
|||
* $loader->setUseIncludePath(true); |
|||
* |
|||
* In this example, if you try to use a class in the Symfony\Component |
|||
* namespace or one of its children (Symfony\Component\Console for instance), |
|||
* the autoloader will first look for the class under the component/ |
|||
* directory, and it will then fallback to the framework/ directory if not |
|||
* found before giving up. |
|||
* |
|||
* This class is loosely based on the Symfony UniversalClassLoader. |
|||
* |
|||
* @author Fabien Potencier <fabien@symfony.com> |
|||
* @author Jordi Boggiano <j.boggiano@seld.be> |
|||
* @see https://www.php-fig.org/psr/psr-0/ |
|||
* @see https://www.php-fig.org/psr/psr-4/ |
|||
*/ |
|||
class ClassLoader |
|||
{ |
|||
// PSR-4 |
|||
private $prefixLengthsPsr4 = array(); |
|||
private $prefixDirsPsr4 = array(); |
|||
private $fallbackDirsPsr4 = array(); |
|||
|
|||
// PSR-0 |
|||
private $prefixesPsr0 = array(); |
|||
private $fallbackDirsPsr0 = array(); |
|||
|
|||
private $useIncludePath = false; |
|||
private $classMap = array(); |
|||
private $classMapAuthoritative = false; |
|||
private $missingClasses = array(); |
|||
private $apcuPrefix; |
|||
|
|||
public function getPrefixes() |
|||
{ |
|||
if (!empty($this->prefixesPsr0)) { |
|||
return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); |
|||
} |
|||
|
|||
return array(); |
|||
} |
|||
|
|||
public function getPrefixesPsr4() |
|||
{ |
|||
return $this->prefixDirsPsr4; |
|||
} |
|||
|
|||
public function getFallbackDirs() |
|||
{ |
|||
return $this->fallbackDirsPsr0; |
|||
} |
|||
|
|||
public function getFallbackDirsPsr4() |
|||
{ |
|||
return $this->fallbackDirsPsr4; |
|||
} |
|||
|
|||
public function getClassMap() |
|||
{ |
|||
return $this->classMap; |
|||
} |
|||
|
|||
/** |
|||
* @param array $classMap Class to filename map |
|||
*/ |
|||
public function addClassMap(array $classMap) |
|||
{ |
|||
if ($this->classMap) { |
|||
$this->classMap = array_merge($this->classMap, $classMap); |
|||
} else { |
|||
$this->classMap = $classMap; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Registers a set of PSR-0 directories for a given prefix, either |
|||
* appending or prepending to the ones previously set for this prefix. |
|||
* |
|||
* @param string $prefix The prefix |
|||
* @param array|string $paths The PSR-0 root directories |
|||
* @param bool $prepend Whether to prepend the directories |
|||
*/ |
|||
public function add($prefix, $paths, $prepend = false) |
|||
{ |
|||
if (!$prefix) { |
|||
if ($prepend) { |
|||
$this->fallbackDirsPsr0 = array_merge( |
|||
(array) $paths, |
|||
$this->fallbackDirsPsr0 |
|||
); |
|||
} else { |
|||
$this->fallbackDirsPsr0 = array_merge( |
|||
$this->fallbackDirsPsr0, |
|||
(array) $paths |
|||
); |
|||
} |
|||
|
|||
return; |
|||
} |
|||
|
|||
$first = $prefix[0]; |
|||
if (!isset($this->prefixesPsr0[$first][$prefix])) { |
|||
$this->prefixesPsr0[$first][$prefix] = (array) $paths; |
|||
|
|||
return; |
|||
} |
|||
if ($prepend) { |
|||
$this->prefixesPsr0[$first][$prefix] = array_merge( |
|||
(array) $paths, |
|||
$this->prefixesPsr0[$first][$prefix] |
|||
); |
|||
} else { |
|||
$this->prefixesPsr0[$first][$prefix] = array_merge( |
|||
$this->prefixesPsr0[$first][$prefix], |
|||
(array) $paths |
|||
); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Registers a set of PSR-4 directories for a given namespace, either |
|||
* appending or prepending to the ones previously set for this namespace. |
|||
* |
|||
* @param string $prefix The prefix/namespace, with trailing '\\' |
|||
* @param array|string $paths The PSR-4 base directories |
|||
* @param bool $prepend Whether to prepend the directories |
|||
* |
|||
* @throws \InvalidArgumentException |
|||
*/ |
|||
public function addPsr4($prefix, $paths, $prepend = false) |
|||
{ |
|||
if (!$prefix) { |
|||
// Register directories for the root namespace. |
|||
if ($prepend) { |
|||
$this->fallbackDirsPsr4 = array_merge( |
|||
(array) $paths, |
|||
$this->fallbackDirsPsr4 |
|||
); |
|||
} else { |
|||
$this->fallbackDirsPsr4 = array_merge( |
|||
$this->fallbackDirsPsr4, |
|||
(array) $paths |
|||
); |
|||
} |
|||
} elseif (!isset($this->prefixDirsPsr4[$prefix])) { |
|||
// Register directories for a new namespace. |
|||
$length = strlen($prefix); |
|||
if ('\\' !== $prefix[$length - 1]) { |
|||
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); |
|||
} |
|||
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; |
|||
$this->prefixDirsPsr4[$prefix] = (array) $paths; |
|||
} elseif ($prepend) { |
|||
// Prepend directories for an already registered namespace. |
|||
$this->prefixDirsPsr4[$prefix] = array_merge( |
|||
(array) $paths, |
|||
$this->prefixDirsPsr4[$prefix] |
|||
); |
|||
} else { |
|||
// Append directories for an already registered namespace. |
|||
$this->prefixDirsPsr4[$prefix] = array_merge( |
|||
$this->prefixDirsPsr4[$prefix], |
|||
(array) $paths |
|||
); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Registers a set of PSR-0 directories for a given prefix, |
|||
* replacing any others previously set for this prefix. |
|||
* |
|||
* @param string $prefix The prefix |
|||
* @param array|string $paths The PSR-0 base directories |
|||
*/ |
|||
public function set($prefix, $paths) |
|||
{ |
|||
if (!$prefix) { |
|||
$this->fallbackDirsPsr0 = (array) $paths; |
|||
} else { |
|||
$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Registers a set of PSR-4 directories for a given namespace, |
|||
* replacing any others previously set for this namespace. |
|||
* |
|||
* @param string $prefix The prefix/namespace, with trailing '\\' |
|||
* @param array|string $paths The PSR-4 base directories |
|||
* |
|||
* @throws \InvalidArgumentException |
|||
*/ |
|||
public function setPsr4($prefix, $paths) |
|||
{ |
|||
if (!$prefix) { |
|||
$this->fallbackDirsPsr4 = (array) $paths; |
|||
} else { |
|||
$length = strlen($prefix); |
|||
if ('\\' !== $prefix[$length - 1]) { |
|||
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); |
|||
} |
|||
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; |
|||
$this->prefixDirsPsr4[$prefix] = (array) $paths; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Turns on searching the include path for class files. |
|||
* |
|||
* @param bool $useIncludePath |
|||
*/ |
|||
public function setUseIncludePath($useIncludePath) |
|||
{ |
|||
$this->useIncludePath = $useIncludePath; |
|||
} |
|||
|
|||
/** |
|||
* Can be used to check if the autoloader uses the include path to check |
|||
* for classes. |
|||
* |
|||
* @return bool |
|||
*/ |
|||
public function getUseIncludePath() |
|||
{ |
|||
return $this->useIncludePath; |
|||
} |
|||
|
|||
/** |
|||
* Turns off searching the prefix and fallback directories for classes |
|||
* that have not been registered with the class map. |
|||
* |
|||
* @param bool $classMapAuthoritative |
|||
*/ |
|||
public function setClassMapAuthoritative($classMapAuthoritative) |
|||
{ |
|||
$this->classMapAuthoritative = $classMapAuthoritative; |
|||
} |
|||
|
|||
/** |
|||
* Should class lookup fail if not found in the current class map? |
|||
* |
|||
* @return bool |
|||
*/ |
|||
public function isClassMapAuthoritative() |
|||
{ |
|||
return $this->classMapAuthoritative; |
|||
} |
|||
|
|||
/** |
|||
* APCu prefix to use to cache found/not-found classes, if the extension is enabled. |
|||
* |
|||
* @param string|null $apcuPrefix |
|||
*/ |
|||
public function setApcuPrefix($apcuPrefix) |
|||
{ |
|||
$this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; |
|||
} |
|||
|
|||
/** |
|||
* The APCu prefix in use, or null if APCu caching is not enabled. |
|||
* |
|||
* @return string|null |
|||
*/ |
|||
public function getApcuPrefix() |
|||
{ |
|||
return $this->apcuPrefix; |
|||
} |
|||
|
|||
/** |
|||
* Registers this instance as an autoloader. |
|||
* |
|||
* @param bool $prepend Whether to prepend the autoloader or not |
|||
*/ |
|||
public function register($prepend = false) |
|||
{ |
|||
spl_autoload_register(array($this, 'loadClass'), true, $prepend); |
|||
} |
|||
|
|||
/** |
|||
* Unregisters this instance as an autoloader. |
|||
*/ |
|||
public function unregister() |
|||
{ |
|||
spl_autoload_unregister(array($this, 'loadClass')); |
|||
} |
|||
|
|||
/** |
|||
* Loads the given class or interface. |
|||
* |
|||
* @param string $class The name of the class |
|||
* @return bool|null True if loaded, null otherwise |
|||
*/ |
|||
public function loadClass($class) |
|||
{ |
|||
if ($file = $this->findFile($class)) { |
|||
includeFile($file); |
|||
|
|||
return true; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Finds the path to the file where the class is defined. |
|||
* |
|||
* @param string $class The name of the class |
|||
* |
|||
* @return string|false The path if found, false otherwise |
|||
*/ |
|||
public function findFile($class) |
|||
{ |
|||
// class map lookup |
|||
if (isset($this->classMap[$class])) { |
|||
return $this->classMap[$class]; |
|||
} |
|||
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { |
|||
return false; |
|||
} |
|||
if (null !== $this->apcuPrefix) { |
|||
$file = apcu_fetch($this->apcuPrefix.$class, $hit); |
|||
if ($hit) { |
|||
return $file; |
|||
} |
|||
} |
|||
|
|||
$file = $this->findFileWithExtension($class, '.php'); |
|||
|
|||
// Search for Hack files if we are running on HHVM |
|||
if (false === $file && defined('HHVM_VERSION')) { |
|||
$file = $this->findFileWithExtension($class, '.hh'); |
|||
} |
|||
|
|||
if (null !== $this->apcuPrefix) { |
|||
apcu_add($this->apcuPrefix.$class, $file); |
|||
} |
|||
|
|||
if (false === $file) { |
|||
// Remember that this class does not exist. |
|||
$this->missingClasses[$class] = true; |
|||
} |
|||
|
|||
return $file; |
|||
} |
|||
|
|||
private function findFileWithExtension($class, $ext) |
|||
{ |
|||
// PSR-4 lookup |
|||
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; |
|||
|
|||
$first = $class[0]; |
|||
if (isset($this->prefixLengthsPsr4[$first])) { |
|||
$subPath = $class; |
|||
while (false !== $lastPos = strrpos($subPath, '\\')) { |
|||
$subPath = substr($subPath, 0, $lastPos); |
|||
$search = $subPath . '\\'; |
|||
if (isset($this->prefixDirsPsr4[$search])) { |
|||
$pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); |
|||
foreach ($this->prefixDirsPsr4[$search] as $dir) { |
|||
if (file_exists($file = $dir . $pathEnd)) { |
|||
return $file; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
// PSR-4 fallback dirs |
|||
foreach ($this->fallbackDirsPsr4 as $dir) { |
|||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { |
|||
return $file; |
|||
} |
|||
} |
|||
|
|||
// PSR-0 lookup |
|||
if (false !== $pos = strrpos($class, '\\')) { |
|||
// namespaced class name |
|||
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) |
|||
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); |
|||
} else { |
|||
// PEAR-like class name |
|||
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; |
|||
} |
|||
|
|||
if (isset($this->prefixesPsr0[$first])) { |
|||
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { |
|||
if (0 === strpos($class, $prefix)) { |
|||
foreach ($dirs as $dir) { |
|||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { |
|||
return $file; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
// PSR-0 fallback dirs |
|||
foreach ($this->fallbackDirsPsr0 as $dir) { |
|||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { |
|||
return $file; |
|||
} |
|||
} |
|||
|
|||
// PSR-0 include paths. |
|||
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { |
|||
return $file; |
|||
} |
|||
|
|||
return false; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Scope isolated include. |
|||
* |
|||
* Prevents access to $this/self from included files. |
|||
*/ |
|||
function includeFile($file) |
|||
{ |
|||
include $file; |
|||
} |
@ -0,0 +1,457 @@ |
|||
<?php |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
namespace Composer; |
|||
|
|||
use Composer\Semver\VersionParser; |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
class InstalledVersions |
|||
{ |
|||
private static $installed = array ( |
|||
'root' => |
|||
array ( |
|||
'pretty_version' => 'dev-config', |
|||
'version' => 'dev-config', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '2eaf359bcdee9c74098c35ebfddaa5f6870b0907', |
|||
'name' => '__root__', |
|||
), |
|||
'versions' => |
|||
array ( |
|||
'__root__' => |
|||
array ( |
|||
'pretty_version' => 'dev-config', |
|||
'version' => 'dev-config', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '2eaf359bcdee9c74098c35ebfddaa5f6870b0907', |
|||
), |
|||
'doctrine/instantiator' => |
|||
array ( |
|||
'pretty_version' => '1.4.0', |
|||
'version' => '1.4.0.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => 'd56bf6102915de5702778fe20f2de3b2fe570b5b', |
|||
), |
|||
'myclabs/deep-copy' => |
|||
array ( |
|||
'pretty_version' => '1.10.2', |
|||
'version' => '1.10.2.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '776f831124e9c62e1a2c601ecc52e776d8bb7220', |
|||
'replaced' => |
|||
array ( |
|||
0 => '1.10.2', |
|||
), |
|||
), |
|||
'phpdocumentor/reflection-common' => |
|||
array ( |
|||
'pretty_version' => '2.2.0', |
|||
'version' => '2.2.0.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b', |
|||
), |
|||
'phpdocumentor/reflection-docblock' => |
|||
array ( |
|||
'pretty_version' => '5.2.2', |
|||
'version' => '5.2.2.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '069a785b2141f5bcf49f3e353548dc1cce6df556', |
|||
), |
|||
'phpdocumentor/type-resolver' => |
|||
array ( |
|||
'pretty_version' => '1.4.0', |
|||
'version' => '1.4.0.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0', |
|||
), |
|||
'phpspec/prophecy' => |
|||
array ( |
|||
'pretty_version' => 'v1.10.3', |
|||
'version' => '1.10.3.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '451c3cd1418cf640de218914901e51b064abb093', |
|||
), |
|||
'phpunit/php-code-coverage' => |
|||
array ( |
|||
'pretty_version' => '4.0.8', |
|||
'version' => '4.0.8.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => 'ef7b2f56815df854e66ceaee8ebe9393ae36a40d', |
|||
), |
|||
'phpunit/php-file-iterator' => |
|||
array ( |
|||
'pretty_version' => '1.4.5', |
|||
'version' => '1.4.5.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '730b01bc3e867237eaac355e06a36b85dd93a8b4', |
|||
), |
|||
'phpunit/php-text-template' => |
|||
array ( |
|||
'pretty_version' => '1.2.1', |
|||
'version' => '1.2.1.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '31f8b717e51d9a2afca6c9f046f5d69fc27c8686', |
|||
), |
|||
'phpunit/php-timer' => |
|||
array ( |
|||
'pretty_version' => '1.0.9', |
|||
'version' => '1.0.9.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '3dcf38ca72b158baf0bc245e9184d3fdffa9c46f', |
|||
), |
|||
'phpunit/php-token-stream' => |
|||
array ( |
|||
'pretty_version' => '2.0.2', |
|||
'version' => '2.0.2.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '791198a2c6254db10131eecfe8c06670700904db', |
|||
), |
|||
'phpunit/phpunit' => |
|||
array ( |
|||
'pretty_version' => '5.7.27', |
|||
'version' => '5.7.27.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => 'b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c', |
|||
), |
|||
'phpunit/phpunit-mock-objects' => |
|||
array ( |
|||
'pretty_version' => '3.4.4', |
|||
'version' => '3.4.4.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => 'a23b761686d50a560cc56233b9ecf49597cc9118', |
|||
), |
|||
'sebastian/code-unit-reverse-lookup' => |
|||
array ( |
|||
'pretty_version' => '1.0.2', |
|||
'version' => '1.0.2.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '1de8cd5c010cb153fcd68b8d0f64606f523f7619', |
|||
), |
|||
'sebastian/comparator' => |
|||
array ( |
|||
'pretty_version' => '1.2.4', |
|||
'version' => '1.2.4.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '2b7424b55f5047b47ac6e5ccb20b2aea4011d9be', |
|||
), |
|||
'sebastian/diff' => |
|||
array ( |
|||
'pretty_version' => '1.4.3', |
|||
'version' => '1.4.3.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '7f066a26a962dbe58ddea9f72a4e82874a3975a4', |
|||
), |
|||
'sebastian/environment' => |
|||
array ( |
|||
'pretty_version' => '2.0.0', |
|||
'version' => '2.0.0.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '5795ffe5dc5b02460c3e34222fee8cbe245d8fac', |
|||
), |
|||
'sebastian/exporter' => |
|||
array ( |
|||
'pretty_version' => '2.0.0', |
|||
'version' => '2.0.0.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => 'ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4', |
|||
), |
|||
'sebastian/global-state' => |
|||
array ( |
|||
'pretty_version' => '1.1.1', |
|||
'version' => '1.1.1.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => 'bc37d50fea7d017d3d340f230811c9f1d7280af4', |
|||
), |
|||
'sebastian/object-enumerator' => |
|||
array ( |
|||
'pretty_version' => '2.0.1', |
|||
'version' => '2.0.1.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '1311872ac850040a79c3c058bea3e22d0f09cbb7', |
|||
), |
|||
'sebastian/recursion-context' => |
|||
array ( |
|||
'pretty_version' => '2.0.0', |
|||
'version' => '2.0.0.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '2c3ba150cbec723aa057506e73a8d33bdb286c9a', |
|||
), |
|||
'sebastian/resource-operations' => |
|||
array ( |
|||
'pretty_version' => '1.0.0', |
|||
'version' => '1.0.0.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => 'ce990bb21759f94aeafd30209e8cfcdfa8bc3f52', |
|||
), |
|||
'sebastian/version' => |
|||
array ( |
|||
'pretty_version' => '2.0.1', |
|||
'version' => '2.0.1.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '99732be0ddb3361e16ad77b68ba41efc8e979019', |
|||
), |
|||
'symfony/polyfill-ctype' => |
|||
array ( |
|||
'pretty_version' => 'v1.20.0', |
|||
'version' => '1.20.0.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => 'f4ba089a5b6366e453971d3aad5fe8e897b37f41', |
|||
), |
|||
'symfony/yaml' => |
|||
array ( |
|||
'pretty_version' => 'v4.4.18', |
|||
'version' => '4.4.18.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => 'bbce94f14d73732340740366fcbe63363663a403', |
|||
), |
|||
'webmozart/assert' => |
|||
array ( |
|||
'pretty_version' => '1.9.1', |
|||
'version' => '1.9.1.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => 'bafc69caeb4d49c39fd0779086c03a3738cbb389', |
|||
), |
|||
), |
|||
); |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
public static function getInstalledPackages() |
|||
{ |
|||
return array_keys(self::$installed['versions']); |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
public static function isInstalled($packageName) |
|||
{ |
|||
return isset(self::$installed['versions'][$packageName]); |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
public static function satisfies(VersionParser $parser, $packageName, $constraint) |
|||
{ |
|||
$constraint = $parser->parseConstraints($constraint); |
|||
$provided = $parser->parseConstraints(self::getVersionRanges($packageName)); |
|||
|
|||
return $provided->matches($constraint); |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
public static function getVersionRanges($packageName) |
|||
{ |
|||
if (!isset(self::$installed['versions'][$packageName])) { |
|||
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); |
|||
} |
|||
|
|||
$ranges = array(); |
|||
if (isset(self::$installed['versions'][$packageName]['pretty_version'])) { |
|||
$ranges[] = self::$installed['versions'][$packageName]['pretty_version']; |
|||
} |
|||
if (array_key_exists('aliases', self::$installed['versions'][$packageName])) { |
|||
$ranges = array_merge($ranges, self::$installed['versions'][$packageName]['aliases']); |
|||
} |
|||
if (array_key_exists('replaced', self::$installed['versions'][$packageName])) { |
|||
$ranges = array_merge($ranges, self::$installed['versions'][$packageName]['replaced']); |
|||
} |
|||
if (array_key_exists('provided', self::$installed['versions'][$packageName])) { |
|||
$ranges = array_merge($ranges, self::$installed['versions'][$packageName]['provided']); |
|||
} |
|||
|
|||
return implode(' || ', $ranges); |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
public static function getVersion($packageName) |
|||
{ |
|||
if (!isset(self::$installed['versions'][$packageName])) { |
|||
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); |
|||
} |
|||
|
|||
if (!isset(self::$installed['versions'][$packageName]['version'])) { |
|||
return null; |
|||
} |
|||
|
|||
return self::$installed['versions'][$packageName]['version']; |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
public static function getPrettyVersion($packageName) |
|||
{ |
|||
if (!isset(self::$installed['versions'][$packageName])) { |
|||
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); |
|||
} |
|||
|
|||
if (!isset(self::$installed['versions'][$packageName]['pretty_version'])) { |
|||
return null; |
|||
} |
|||
|
|||
return self::$installed['versions'][$packageName]['pretty_version']; |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
public static function getReference($packageName) |
|||
{ |
|||
if (!isset(self::$installed['versions'][$packageName])) { |
|||
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); |
|||
} |
|||
|
|||
if (!isset(self::$installed['versions'][$packageName]['reference'])) { |
|||
return null; |
|||
} |
|||
|
|||
return self::$installed['versions'][$packageName]['reference']; |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
public static function getRootPackage() |
|||
{ |
|||
return self::$installed['root']; |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
public static function getRawData() |
|||
{ |
|||
return self::$installed; |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
public static function reload($data) |
|||
{ |
|||
self::$installed = $data; |
|||
} |
|||
} |
@ -0,0 +1,21 @@ |
|||
|
|||
Copyright (c) Nils Adermann, Jordi Boggiano |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is furnished |
|||
to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in all |
|||
copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
THE SOFTWARE. |
|||
|
@ -0,0 +1,475 @@ |
|||
<?php |
|||
|
|||
// autoload_classmap.php @generated by Composer |
|||
|
|||
$vendorDir = dirname(dirname(__FILE__)); |
|||
$baseDir = dirname($vendorDir); |
|||
|
|||
return array( |
|||
'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', |
|||
'File_Iterator' => $vendorDir . '/phpunit/php-file-iterator/src/Iterator.php', |
|||
'File_Iterator_Facade' => $vendorDir . '/phpunit/php-file-iterator/src/Facade.php', |
|||
'File_Iterator_Factory' => $vendorDir . '/phpunit/php-file-iterator/src/Factory.php', |
|||
'PHPUnit\\Framework\\Assert' => $vendorDir . '/phpunit/phpunit/src/ForwardCompatibility/Assert.php', |
|||
'PHPUnit\\Framework\\AssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/ForwardCompatibility/AssertionFailedError.php', |
|||
'PHPUnit\\Framework\\BaseTestListener' => $vendorDir . '/phpunit/phpunit/src/ForwardCompatibility/BaseTestListener.php', |
|||
'PHPUnit\\Framework\\Test' => $vendorDir . '/phpunit/phpunit/src/ForwardCompatibility/Test.php', |
|||
'PHPUnit\\Framework\\TestCase' => $vendorDir . '/phpunit/phpunit/src/ForwardCompatibility/TestCase.php', |
|||
'PHPUnit\\Framework\\TestListener' => $vendorDir . '/phpunit/phpunit/src/ForwardCompatibility/TestListener.php', |
|||
'PHPUnit\\Framework\\TestSuite' => $vendorDir . '/phpunit/phpunit/src/ForwardCompatibility/TestSuite.php', |
|||
'PHPUnit_Exception' => $vendorDir . '/phpunit/phpunit/src/Exception.php', |
|||
'PHPUnit_Extensions_GroupTestSuite' => $vendorDir . '/phpunit/phpunit/src/Extensions/GroupTestSuite.php', |
|||
'PHPUnit_Extensions_PhptTestCase' => $vendorDir . '/phpunit/phpunit/src/Extensions/PhptTestCase.php', |
|||
'PHPUnit_Extensions_PhptTestSuite' => $vendorDir . '/phpunit/phpunit/src/Extensions/PhptTestSuite.php', |
|||
'PHPUnit_Extensions_RepeatedTest' => $vendorDir . '/phpunit/phpunit/src/Extensions/RepeatedTest.php', |
|||
'PHPUnit_Extensions_TestDecorator' => $vendorDir . '/phpunit/phpunit/src/Extensions/TestDecorator.php', |
|||
'PHPUnit_Extensions_TicketListener' => $vendorDir . '/phpunit/phpunit/src/Extensions/TicketListener.php', |
|||
'PHPUnit_Framework_Assert' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert.php', |
|||
'PHPUnit_Framework_AssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/Framework/AssertionFailedError.php', |
|||
'PHPUnit_Framework_BaseTestListener' => $vendorDir . '/phpunit/phpunit/src/Framework/BaseTestListener.php', |
|||
'PHPUnit_Framework_CodeCoverageException' => $vendorDir . '/phpunit/phpunit/src/Framework/CodeCoverageException.php', |
|||
'PHPUnit_Framework_Constraint' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint.php', |
|||
'PHPUnit_Framework_Constraint_And' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/And.php', |
|||
'PHPUnit_Framework_Constraint_ArrayHasKey' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php', |
|||
'PHPUnit_Framework_Constraint_ArraySubset' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php', |
|||
'PHPUnit_Framework_Constraint_Attribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Attribute.php', |
|||
'PHPUnit_Framework_Constraint_Callback' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Callback.php', |
|||
'PHPUnit_Framework_Constraint_ClassHasAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php', |
|||
'PHPUnit_Framework_Constraint_ClassHasStaticAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php', |
|||
'PHPUnit_Framework_Constraint_Composite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Composite.php', |
|||
'PHPUnit_Framework_Constraint_Count' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Count.php', |
|||
'PHPUnit_Framework_Constraint_DirectoryExists' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/DirectoryExists.php', |
|||
'PHPUnit_Framework_Constraint_Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Exception.php', |
|||
'PHPUnit_Framework_Constraint_ExceptionCode' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php', |
|||
'PHPUnit_Framework_Constraint_ExceptionMessage' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php', |
|||
'PHPUnit_Framework_Constraint_ExceptionMessageRegExp' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegExp.php', |
|||
'PHPUnit_Framework_Constraint_FileExists' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/FileExists.php', |
|||
'PHPUnit_Framework_Constraint_GreaterThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php', |
|||
'PHPUnit_Framework_Constraint_IsAnything' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsAnything.php', |
|||
'PHPUnit_Framework_Constraint_IsEmpty' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php', |
|||
'PHPUnit_Framework_Constraint_IsEqual' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsEqual.php', |
|||
'PHPUnit_Framework_Constraint_IsFalse' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsFalse.php', |
|||
'PHPUnit_Framework_Constraint_IsFinite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsFinite.php', |
|||
'PHPUnit_Framework_Constraint_IsIdentical' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php', |
|||
'PHPUnit_Framework_Constraint_IsInfinite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsInfinite.php', |
|||
'PHPUnit_Framework_Constraint_IsInstanceOf' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php', |
|||
'PHPUnit_Framework_Constraint_IsJson' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsJson.php', |
|||
'PHPUnit_Framework_Constraint_IsNan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsNan.php', |
|||
'PHPUnit_Framework_Constraint_IsNull' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsNull.php', |
|||
'PHPUnit_Framework_Constraint_IsReadable' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsReadable.php', |
|||
'PHPUnit_Framework_Constraint_IsTrue' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsTrue.php', |
|||
'PHPUnit_Framework_Constraint_IsType' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsType.php', |
|||
'PHPUnit_Framework_Constraint_IsWritable' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsWritable.php', |
|||
'PHPUnit_Framework_Constraint_JsonMatches' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php', |
|||
'PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches/ErrorMessageProvider.php', |
|||
'PHPUnit_Framework_Constraint_LessThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LessThan.php', |
|||
'PHPUnit_Framework_Constraint_Not' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Not.php', |
|||
'PHPUnit_Framework_Constraint_ObjectHasAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php', |
|||
'PHPUnit_Framework_Constraint_Or' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Or.php', |
|||
'PHPUnit_Framework_Constraint_PCREMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/PCREMatch.php', |
|||
'PHPUnit_Framework_Constraint_SameSize' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/SameSize.php', |
|||
'PHPUnit_Framework_Constraint_StringContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringContains.php', |
|||
'PHPUnit_Framework_Constraint_StringEndsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php', |
|||
'PHPUnit_Framework_Constraint_StringMatches' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringMatches.php', |
|||
'PHPUnit_Framework_Constraint_StringStartsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php', |
|||
'PHPUnit_Framework_Constraint_TraversableContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php', |
|||
'PHPUnit_Framework_Constraint_TraversableContainsOnly' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php', |
|||
'PHPUnit_Framework_Constraint_Xor' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Xor.php', |
|||
'PHPUnit_Framework_CoveredCodeNotExecutedException' => $vendorDir . '/phpunit/phpunit/src/Framework/CoveredCodeNotExecutedException.php', |
|||
'PHPUnit_Framework_Error' => $vendorDir . '/phpunit/phpunit/src/Framework/Error.php', |
|||
'PHPUnit_Framework_Error_Deprecated' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Deprecated.php', |
|||
'PHPUnit_Framework_Error_Notice' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Notice.php', |
|||
'PHPUnit_Framework_Error_Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Warning.php', |
|||
'PHPUnit_Framework_Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception.php', |
|||
'PHPUnit_Framework_ExceptionWrapper' => $vendorDir . '/phpunit/phpunit/src/Framework/ExceptionWrapper.php', |
|||
'PHPUnit_Framework_ExpectationFailedException' => $vendorDir . '/phpunit/phpunit/src/Framework/ExpectationFailedException.php', |
|||
'PHPUnit_Framework_IncompleteTest' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTest.php', |
|||
'PHPUnit_Framework_IncompleteTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTestCase.php', |
|||
'PHPUnit_Framework_IncompleteTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTestError.php', |
|||
'PHPUnit_Framework_InvalidCoversTargetException' => $vendorDir . '/phpunit/phpunit/src/Framework/InvalidCoversTargetException.php', |
|||
'PHPUnit_Framework_MissingCoversAnnotationException' => $vendorDir . '/phpunit/phpunit/src/Framework/MissingCoversAnnotationException.php', |
|||
'PHPUnit_Framework_MockObject_BadMethodCallException' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/BadMethodCallException.php', |
|||
'PHPUnit_Framework_MockObject_Builder_Identity' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Identity.php', |
|||
'PHPUnit_Framework_MockObject_Builder_InvocationMocker' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/InvocationMocker.php', |
|||
'PHPUnit_Framework_MockObject_Builder_Match' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Match.php', |
|||
'PHPUnit_Framework_MockObject_Builder_MethodNameMatch' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/MethodNameMatch.php', |
|||
'PHPUnit_Framework_MockObject_Builder_Namespace' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Namespace.php', |
|||
'PHPUnit_Framework_MockObject_Builder_ParametersMatch' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/ParametersMatch.php', |
|||
'PHPUnit_Framework_MockObject_Builder_Stub' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Stub.php', |
|||
'PHPUnit_Framework_MockObject_Exception' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/Exception.php', |
|||
'PHPUnit_Framework_MockObject_Generator' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator.php', |
|||
'PHPUnit_Framework_MockObject_Invocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation.php', |
|||
'PHPUnit_Framework_MockObject_InvocationMocker' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/InvocationMocker.php', |
|||
'PHPUnit_Framework_MockObject_Invocation_Object' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation/Object.php', |
|||
'PHPUnit_Framework_MockObject_Invocation_Static' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation/Static.php', |
|||
'PHPUnit_Framework_MockObject_Invokable' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invokable.php', |
|||
'PHPUnit_Framework_MockObject_Matcher' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/AnyInvokedCount.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_AnyParameters' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/AnyParameters.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_ConsecutiveParameters' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/ConsecutiveParameters.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_Invocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/Invocation.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtIndex.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtLeastCount.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtLeastOnce.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_InvokedAtMostCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtMostCount.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_InvokedCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedCount.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_InvokedRecorder' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedRecorder.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_MethodName' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/MethodName.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_Parameters' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/Parameters.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_StatelessInvocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/StatelessInvocation.php', |
|||
'PHPUnit_Framework_MockObject_MockBuilder' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/MockBuilder.php', |
|||
'PHPUnit_Framework_MockObject_MockObject' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/MockObject.php', |
|||
'PHPUnit_Framework_MockObject_RuntimeException' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/RuntimeException.php', |
|||
'PHPUnit_Framework_MockObject_Stub' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub.php', |
|||
'PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ConsecutiveCalls.php', |
|||
'PHPUnit_Framework_MockObject_Stub_Exception' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/Exception.php', |
|||
'PHPUnit_Framework_MockObject_Stub_MatcherCollection' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/MatcherCollection.php', |
|||
'PHPUnit_Framework_MockObject_Stub_Return' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/Return.php', |
|||
'PHPUnit_Framework_MockObject_Stub_ReturnArgument' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnArgument.php', |
|||
'PHPUnit_Framework_MockObject_Stub_ReturnCallback' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnCallback.php', |
|||
'PHPUnit_Framework_MockObject_Stub_ReturnReference' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnReference.php', |
|||
'PHPUnit_Framework_MockObject_Stub_ReturnSelf' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnSelf.php', |
|||
'PHPUnit_Framework_MockObject_Stub_ReturnValueMap' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnValueMap.php', |
|||
'PHPUnit_Framework_MockObject_Verifiable' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Verifiable.php', |
|||
'PHPUnit_Framework_OutputError' => $vendorDir . '/phpunit/phpunit/src/Framework/OutputError.php', |
|||
'PHPUnit_Framework_RiskyTest' => $vendorDir . '/phpunit/phpunit/src/Framework/RiskyTest.php', |
|||
'PHPUnit_Framework_RiskyTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/RiskyTestError.php', |
|||
'PHPUnit_Framework_SelfDescribing' => $vendorDir . '/phpunit/phpunit/src/Framework/SelfDescribing.php', |
|||
'PHPUnit_Framework_SkippedTest' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTest.php', |
|||
'PHPUnit_Framework_SkippedTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTestCase.php', |
|||
'PHPUnit_Framework_SkippedTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTestError.php', |
|||
'PHPUnit_Framework_SkippedTestSuiteError' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTestSuiteError.php', |
|||
'PHPUnit_Framework_SyntheticError' => $vendorDir . '/phpunit/phpunit/src/Framework/SyntheticError.php', |
|||
'PHPUnit_Framework_Test' => $vendorDir . '/phpunit/phpunit/src/Framework/Test.php', |
|||
'PHPUnit_Framework_TestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/TestCase.php', |
|||
'PHPUnit_Framework_TestFailure' => $vendorDir . '/phpunit/phpunit/src/Framework/TestFailure.php', |
|||
'PHPUnit_Framework_TestListener' => $vendorDir . '/phpunit/phpunit/src/Framework/TestListener.php', |
|||
'PHPUnit_Framework_TestResult' => $vendorDir . '/phpunit/phpunit/src/Framework/TestResult.php', |
|||
'PHPUnit_Framework_TestSuite' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuite.php', |
|||
'PHPUnit_Framework_TestSuite_DataProvider' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuite/DataProvider.php', |
|||
'PHPUnit_Framework_UnintentionallyCoveredCodeError' => $vendorDir . '/phpunit/phpunit/src/Framework/UnintentionallyCoveredCodeError.php', |
|||
'PHPUnit_Framework_Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/Warning.php', |
|||
'PHPUnit_Framework_WarningTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/WarningTestCase.php', |
|||
'PHPUnit_Runner_BaseTestRunner' => $vendorDir . '/phpunit/phpunit/src/Runner/BaseTestRunner.php', |
|||
'PHPUnit_Runner_Exception' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception.php', |
|||
'PHPUnit_Runner_Filter_Factory' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Factory.php', |
|||
'PHPUnit_Runner_Filter_GroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Group.php', |
|||
'PHPUnit_Runner_Filter_Group_Exclude' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Group/Exclude.php', |
|||
'PHPUnit_Runner_Filter_Group_Include' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Group/Include.php', |
|||
'PHPUnit_Runner_Filter_Test' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Test.php', |
|||
'PHPUnit_Runner_StandardTestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php', |
|||
'PHPUnit_Runner_TestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php', |
|||
'PHPUnit_Runner_Version' => $vendorDir . '/phpunit/phpunit/src/Runner/Version.php', |
|||
'PHPUnit_TextUI_Command' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command.php', |
|||
'PHPUnit_TextUI_ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/ResultPrinter.php', |
|||
'PHPUnit_TextUI_TestRunner' => $vendorDir . '/phpunit/phpunit/src/TextUI/TestRunner.php', |
|||
'PHPUnit_Util_Blacklist' => $vendorDir . '/phpunit/phpunit/src/Util/Blacklist.php', |
|||
'PHPUnit_Util_Configuration' => $vendorDir . '/phpunit/phpunit/src/Util/Configuration.php', |
|||
'PHPUnit_Util_ConfigurationGenerator' => $vendorDir . '/phpunit/phpunit/src/Util/ConfigurationGenerator.php', |
|||
'PHPUnit_Util_ErrorHandler' => $vendorDir . '/phpunit/phpunit/src/Util/ErrorHandler.php', |
|||
'PHPUnit_Util_Fileloader' => $vendorDir . '/phpunit/phpunit/src/Util/Fileloader.php', |
|||
'PHPUnit_Util_Filesystem' => $vendorDir . '/phpunit/phpunit/src/Util/Filesystem.php', |
|||
'PHPUnit_Util_Filter' => $vendorDir . '/phpunit/phpunit/src/Util/Filter.php', |
|||
'PHPUnit_Util_Getopt' => $vendorDir . '/phpunit/phpunit/src/Util/Getopt.php', |
|||
'PHPUnit_Util_GlobalState' => $vendorDir . '/phpunit/phpunit/src/Util/GlobalState.php', |
|||
'PHPUnit_Util_InvalidArgumentHelper' => $vendorDir . '/phpunit/phpunit/src/Util/InvalidArgumentHelper.php', |
|||
'PHPUnit_Util_Log_JSON' => $vendorDir . '/phpunit/phpunit/src/Util/Log/JSON.php', |
|||
'PHPUnit_Util_Log_JUnit' => $vendorDir . '/phpunit/phpunit/src/Util/Log/JUnit.php', |
|||
'PHPUnit_Util_Log_TAP' => $vendorDir . '/phpunit/phpunit/src/Util/Log/TAP.php', |
|||
'PHPUnit_Util_Log_TeamCity' => $vendorDir . '/phpunit/phpunit/src/Util/Log/TeamCity.php', |
|||
'PHPUnit_Util_PHP' => $vendorDir . '/phpunit/phpunit/src/Util/PHP.php', |
|||
'PHPUnit_Util_PHP_Default' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/Default.php', |
|||
'PHPUnit_Util_PHP_Windows' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/Windows.php', |
|||
'PHPUnit_Util_Printer' => $vendorDir . '/phpunit/phpunit/src/Util/Printer.php', |
|||
'PHPUnit_Util_Regex' => $vendorDir . '/phpunit/phpunit/src/Util/Regex.php', |
|||
'PHPUnit_Util_String' => $vendorDir . '/phpunit/phpunit/src/Util/String.php', |
|||
'PHPUnit_Util_Test' => $vendorDir . '/phpunit/phpunit/src/Util/Test.php', |
|||
'PHPUnit_Util_TestDox_NamePrettifier' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php', |
|||
'PHPUnit_Util_TestDox_ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php', |
|||
'PHPUnit_Util_TestDox_ResultPrinter_HTML' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/HTML.php', |
|||
'PHPUnit_Util_TestDox_ResultPrinter_Text' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/Text.php', |
|||
'PHPUnit_Util_TestDox_ResultPrinter_XML' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/XML.php', |
|||
'PHPUnit_Util_TestSuiteIterator' => $vendorDir . '/phpunit/phpunit/src/Util/TestSuiteIterator.php', |
|||
'PHPUnit_Util_Type' => $vendorDir . '/phpunit/phpunit/src/Util/Type.php', |
|||
'PHPUnit_Util_XML' => $vendorDir . '/phpunit/phpunit/src/Util/XML.php', |
|||
'PHP_Timer' => $vendorDir . '/phpunit/php-timer/src/Timer.php', |
|||
'PHP_Token' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_TokenWithScope' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_TokenWithScopeAndVisibility' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ABSTRACT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_AMPERSAND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_AND_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ARRAY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ARRAY_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_AS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ASYNC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_AT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_AWAIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_BACKTICK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_BAD_CHARACTER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_BOOLEAN_AND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_BOOLEAN_OR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_BOOL_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_BREAK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CALLABLE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CARET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CASE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CATCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CHARACTER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CLASS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CLASS_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CLASS_NAME_CONSTANT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CLONE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CLOSE_BRACKET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CLOSE_CURLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CLOSE_SQUARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CLOSE_TAG' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_COALESCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_COLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_COMMA' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_COMMENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_COMPILER_HALT_OFFSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CONCAT_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CONST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CONSTANT_ENCAPSED_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CONTINUE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CURLY_OPEN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DEC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DECLARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DEFAULT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DIR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DIV' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DIV_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DNUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DOC_COMMENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DOLLAR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DOLLAR_OPEN_CURLY_BRACES' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DOT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DOUBLE_ARROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DOUBLE_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DOUBLE_COLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DOUBLE_QUOTES' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ECHO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ELLIPSIS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ELSE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ELSEIF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_EMPTY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ENCAPSED_AND_WHITESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ENDDECLARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ENDFOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ENDFOREACH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ENDIF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ENDSWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ENDWHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_END_HEREDOC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ENUM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_EQUALS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_EVAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_EXCLAMATION_MARK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_EXIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_EXTENDS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_FILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_FINAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_FINALLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_FOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_FOREACH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_FUNCTION' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_FUNC_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_GLOBAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_GOTO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_HALT_COMPILER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_IF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_IMPLEMENTS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_IN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_INC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_INCLUDE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_INCLUDE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_INLINE_HTML' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_INSTANCEOF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_INSTEADOF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_INTERFACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_INT_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ISSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_IS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_IS_GREATER_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_IS_IDENTICAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_IS_NOT_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_IS_NOT_IDENTICAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_IS_SMALLER_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_Includes' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_JOIN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_LAMBDA_ARROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_LAMBDA_CP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_LAMBDA_OP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_LINE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_LIST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_LNUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_LOGICAL_AND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_LOGICAL_OR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_LOGICAL_XOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_LT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_METHOD_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_MINUS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_MINUS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_MOD_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_MULT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_MUL_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_NAMESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_NEW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_NS_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_NS_SEPARATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_NULLSAFE_OBJECT_OPERATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_NUM_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_OBJECT_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_OBJECT_OPERATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ONUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_OPEN_BRACKET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_OPEN_CURLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_OPEN_SQUARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_OPEN_TAG' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_OPEN_TAG_WITH_ECHO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_PAAMAYIM_NEKUDOTAYIM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_PERCENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_PIPE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_PLUS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_PLUS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_POW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_POW_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_PRINT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_PRIVATE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_PROTECTED' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_PUBLIC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_QUESTION_MARK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_REQUIRE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_REQUIRE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_RETURN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_SEMICOLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_SHAPE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_SL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_SL_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_SPACESHIP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_SR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_SR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_START_HEREDOC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_STATIC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_STRING_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_STRING_VARNAME' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_SUPER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_SWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_Stream' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream.php', |
|||
'PHP_Token_Stream_CachingFactory' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php', |
|||
'PHP_Token_THROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_TILDE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_TRAIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_TRAIT_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_TRY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_TYPE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_TYPELIST_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_TYPELIST_LT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_UNSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_UNSET_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_USE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_USE_FUNCTION' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_VAR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_VARIABLE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_WHERE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_WHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_WHITESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_XHP_ATTRIBUTE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_XHP_CATEGORY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_XHP_CATEGORY_LABEL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_XHP_CHILDREN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_XHP_LABEL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_XHP_REQUIRED' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_XHP_TAG_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_XHP_TAG_LT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_XHP_TEXT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_XOR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_YIELD' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_YIELD_FROM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', |
|||
'SebastianBergmann\\CodeCoverage\\CodeCoverage' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage.php', |
|||
'SebastianBergmann\\CodeCoverage\\CoveredCodeNotExecutedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php', |
|||
'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Driver.php', |
|||
'SebastianBergmann\\CodeCoverage\\Driver\\HHVM' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/HHVM.php', |
|||
'SebastianBergmann\\CodeCoverage\\Driver\\PHPDBG' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/PHPDBG.php', |
|||
'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Xdebug.php', |
|||
'SebastianBergmann\\CodeCoverage\\Exception' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/Exception.php', |
|||
'SebastianBergmann\\CodeCoverage\\Filter' => $vendorDir . '/phpunit/php-code-coverage/src/Filter.php', |
|||
'SebastianBergmann\\CodeCoverage\\InvalidArgumentException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php', |
|||
'SebastianBergmann\\CodeCoverage\\MissingCoversAnnotationException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/MissingCoversAnnotationException.php', |
|||
'SebastianBergmann\\CodeCoverage\\Node\\AbstractNode' => $vendorDir . '/phpunit/php-code-coverage/src/Node/AbstractNode.php', |
|||
'SebastianBergmann\\CodeCoverage\\Node\\Builder' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Builder.php', |
|||
'SebastianBergmann\\CodeCoverage\\Node\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Directory.php', |
|||
'SebastianBergmann\\CodeCoverage\\Node\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Node/File.php', |
|||
'SebastianBergmann\\CodeCoverage\\Node\\Iterator' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Iterator.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Clover' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Clover.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Crap4j' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Crap4j.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Html\\Dashboard' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Html\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Html\\Facade' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Facade.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Html\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Html\\Renderer' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\PHP' => $vendorDir . '/phpunit/php-code-coverage/src/Report/PHP.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Text' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Text.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Coverage' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Coverage.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Directory.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Facade' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Facade.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Xml\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/File.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Method' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Method.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Node' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Node.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Project' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Project.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Report' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Report.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Tests' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Tests.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Totals' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Totals.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Unit' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Unit.php', |
|||
'SebastianBergmann\\CodeCoverage\\RuntimeException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/RuntimeException.php', |
|||
'SebastianBergmann\\CodeCoverage\\UnintentionallyCoveredCodeException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php', |
|||
'SebastianBergmann\\CodeCoverage\\Util' => $vendorDir . '/phpunit/php-code-coverage/src/Util.php', |
|||
'SebastianBergmann\\CodeUnitReverseLookup\\Wizard' => $vendorDir . '/sebastian/code-unit-reverse-lookup/src/Wizard.php', |
|||
'SebastianBergmann\\Comparator\\ArrayComparator' => $vendorDir . '/sebastian/comparator/src/ArrayComparator.php', |
|||
'SebastianBergmann\\Comparator\\Comparator' => $vendorDir . '/sebastian/comparator/src/Comparator.php', |
|||
'SebastianBergmann\\Comparator\\ComparisonFailure' => $vendorDir . '/sebastian/comparator/src/ComparisonFailure.php', |
|||
'SebastianBergmann\\Comparator\\DOMNodeComparator' => $vendorDir . '/sebastian/comparator/src/DOMNodeComparator.php', |
|||
'SebastianBergmann\\Comparator\\DateTimeComparator' => $vendorDir . '/sebastian/comparator/src/DateTimeComparator.php', |
|||
'SebastianBergmann\\Comparator\\DoubleComparator' => $vendorDir . '/sebastian/comparator/src/DoubleComparator.php', |
|||
'SebastianBergmann\\Comparator\\ExceptionComparator' => $vendorDir . '/sebastian/comparator/src/ExceptionComparator.php', |
|||
'SebastianBergmann\\Comparator\\Factory' => $vendorDir . '/sebastian/comparator/src/Factory.php', |
|||
'SebastianBergmann\\Comparator\\MockObjectComparator' => $vendorDir . '/sebastian/comparator/src/MockObjectComparator.php', |
|||
'SebastianBergmann\\Comparator\\NumericComparator' => $vendorDir . '/sebastian/comparator/src/NumericComparator.php', |
|||
'SebastianBergmann\\Comparator\\ObjectComparator' => $vendorDir . '/sebastian/comparator/src/ObjectComparator.php', |
|||
'SebastianBergmann\\Comparator\\ResourceComparator' => $vendorDir . '/sebastian/comparator/src/ResourceComparator.php', |
|||
'SebastianBergmann\\Comparator\\ScalarComparator' => $vendorDir . '/sebastian/comparator/src/ScalarComparator.php', |
|||
'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => $vendorDir . '/sebastian/comparator/src/SplObjectStorageComparator.php', |
|||
'SebastianBergmann\\Comparator\\TypeComparator' => $vendorDir . '/sebastian/comparator/src/TypeComparator.php', |
|||
'SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php', |
|||
'SebastianBergmann\\Diff\\Diff' => $vendorDir . '/sebastian/diff/src/Diff.php', |
|||
'SebastianBergmann\\Diff\\Differ' => $vendorDir . '/sebastian/diff/src/Differ.php', |
|||
'SebastianBergmann\\Diff\\LCS\\LongestCommonSubsequence' => $vendorDir . '/sebastian/diff/src/LCS/LongestCommonSubsequence.php', |
|||
'SebastianBergmann\\Diff\\LCS\\MemoryEfficientImplementation' => $vendorDir . '/sebastian/diff/src/LCS/MemoryEfficientLongestCommonSubsequenceImplementation.php', |
|||
'SebastianBergmann\\Diff\\LCS\\TimeEfficientImplementation' => $vendorDir . '/sebastian/diff/src/LCS/TimeEfficientLongestCommonSubsequenceImplementation.php', |
|||
'SebastianBergmann\\Diff\\Line' => $vendorDir . '/sebastian/diff/src/Line.php', |
|||
'SebastianBergmann\\Diff\\Parser' => $vendorDir . '/sebastian/diff/src/Parser.php', |
|||
'SebastianBergmann\\Environment\\Console' => $vendorDir . '/sebastian/environment/src/Console.php', |
|||
'SebastianBergmann\\Environment\\Runtime' => $vendorDir . '/sebastian/environment/src/Runtime.php', |
|||
'SebastianBergmann\\Exporter\\Exporter' => $vendorDir . '/sebastian/exporter/src/Exporter.php', |
|||
'SebastianBergmann\\GlobalState\\Blacklist' => $vendorDir . '/sebastian/global-state/src/Blacklist.php', |
|||
'SebastianBergmann\\GlobalState\\CodeExporter' => $vendorDir . '/sebastian/global-state/src/CodeExporter.php', |
|||
'SebastianBergmann\\GlobalState\\Exception' => $vendorDir . '/sebastian/global-state/src/Exception.php', |
|||
'SebastianBergmann\\GlobalState\\Restorer' => $vendorDir . '/sebastian/global-state/src/Restorer.php', |
|||
'SebastianBergmann\\GlobalState\\RuntimeException' => $vendorDir . '/sebastian/global-state/src/RuntimeException.php', |
|||
'SebastianBergmann\\GlobalState\\Snapshot' => $vendorDir . '/sebastian/global-state/src/Snapshot.php', |
|||
'SebastianBergmann\\ObjectEnumerator\\Enumerator' => $vendorDir . '/sebastian/object-enumerator/src/Enumerator.php', |
|||
'SebastianBergmann\\ObjectEnumerator\\Exception' => $vendorDir . '/sebastian/object-enumerator/src/Exception.php', |
|||
'SebastianBergmann\\ObjectEnumerator\\InvalidArgumentException' => $vendorDir . '/sebastian/object-enumerator/src/InvalidArgumentException.php', |
|||
'SebastianBergmann\\RecursionContext\\Context' => $vendorDir . '/sebastian/recursion-context/src/Context.php', |
|||
'SebastianBergmann\\RecursionContext\\Exception' => $vendorDir . '/sebastian/recursion-context/src/Exception.php', |
|||
'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => $vendorDir . '/sebastian/recursion-context/src/InvalidArgumentException.php', |
|||
'SebastianBergmann\\ResourceOperations\\ResourceOperations' => $vendorDir . '/sebastian/resource-operations/src/ResourceOperations.php', |
|||
'SebastianBergmann\\Version' => $vendorDir . '/sebastian/version/src/Version.php', |
|||
'Text_Template' => $vendorDir . '/phpunit/php-text-template/src/Template.php', |
|||
); |
@ -0,0 +1,11 @@ |
|||
<?php |
|||
|
|||
// autoload_files.php @generated by Composer |
|||
|
|||
$vendorDir = dirname(dirname(__FILE__)); |
|||
$baseDir = dirname($vendorDir); |
|||
|
|||
return array( |
|||
'320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', |
|||
'6124b4c8570aa390c21fafd04a26c69f' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', |
|||
); |
@ -0,0 +1,9 @@ |
|||
<?php |
|||
|
|||
// autoload_namespaces.php @generated by Composer |
|||
|
|||
$vendorDir = dirname(dirname(__FILE__)); |
|||
$baseDir = dirname($vendorDir); |
|||
|
|||
return array( |
|||
); |
@ -0,0 +1,16 @@ |
|||
<?php |
|||
|
|||
// autoload_psr4.php @generated by Composer |
|||
|
|||
$vendorDir = dirname(dirname(__FILE__)); |
|||
$baseDir = dirname($vendorDir); |
|||
|
|||
return array( |
|||
'phpDocumentor\\Reflection\\' => array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/type-resolver/src', $vendorDir . '/phpdocumentor/reflection-docblock/src'), |
|||
'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'), |
|||
'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'), |
|||
'Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'), |
|||
'Prophecy\\' => array($vendorDir . '/phpspec/prophecy/src/Prophecy'), |
|||
'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'), |
|||
'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'), |
|||
); |
@ -0,0 +1,75 @@ |
|||
<?php |
|||
|
|||
// autoload_real.php @generated by Composer |
|||
|
|||
class ComposerAutoloaderInit1eb0bd8b9bd803db01b2c2a0cd8b9817 |
|||
{ |
|||
private static $loader; |
|||
|
|||
public static function loadClassLoader($class) |
|||
{ |
|||
if ('Composer\Autoload\ClassLoader' === $class) { |
|||
require __DIR__ . '/ClassLoader.php'; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* @return \Composer\Autoload\ClassLoader |
|||
*/ |
|||
public static function getLoader() |
|||
{ |
|||
if (null !== self::$loader) { |
|||
return self::$loader; |
|||
} |
|||
|
|||
require __DIR__ . '/platform_check.php'; |
|||
|
|||
spl_autoload_register(array('ComposerAutoloaderInit1eb0bd8b9bd803db01b2c2a0cd8b9817', 'loadClassLoader'), true, true); |
|||
self::$loader = $loader = new \Composer\Autoload\ClassLoader(); |
|||
spl_autoload_unregister(array('ComposerAutoloaderInit1eb0bd8b9bd803db01b2c2a0cd8b9817', 'loadClassLoader')); |
|||
|
|||
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); |
|||
if ($useStaticLoader) { |
|||
require __DIR__ . '/autoload_static.php'; |
|||
|
|||
call_user_func(\Composer\Autoload\ComposerStaticInit1eb0bd8b9bd803db01b2c2a0cd8b9817::getInitializer($loader)); |
|||
} else { |
|||
$map = require __DIR__ . '/autoload_namespaces.php'; |
|||
foreach ($map as $namespace => $path) { |
|||
$loader->set($namespace, $path); |
|||
} |
|||
|
|||
$map = require __DIR__ . '/autoload_psr4.php'; |
|||
foreach ($map as $namespace => $path) { |
|||
$loader->setPsr4($namespace, $path); |
|||
} |
|||
|
|||
$classMap = require __DIR__ . '/autoload_classmap.php'; |
|||
if ($classMap) { |
|||
$loader->addClassMap($classMap); |
|||
} |
|||
} |
|||
|
|||
$loader->register(true); |
|||
|
|||
if ($useStaticLoader) { |
|||
$includeFiles = Composer\Autoload\ComposerStaticInit1eb0bd8b9bd803db01b2c2a0cd8b9817::$files; |
|||
} else { |
|||
$includeFiles = require __DIR__ . '/autoload_files.php'; |
|||
} |
|||
foreach ($includeFiles as $fileIdentifier => $file) { |
|||
composerRequire1eb0bd8b9bd803db01b2c2a0cd8b9817($fileIdentifier, $file); |
|||
} |
|||
|
|||
return $loader; |
|||
} |
|||
} |
|||
|
|||
function composerRequire1eb0bd8b9bd803db01b2c2a0cd8b9817($fileIdentifier, $file) |
|||
{ |
|||
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { |
|||
require $file; |
|||
|
|||
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; |
|||
} |
|||
} |
@ -0,0 +1,550 @@ |
|||
<?php |
|||
|
|||
// autoload_static.php @generated by Composer |
|||
|
|||
namespace Composer\Autoload; |
|||
|
|||
class ComposerStaticInit1eb0bd8b9bd803db01b2c2a0cd8b9817 |
|||
{ |
|||
public static $files = array ( |
|||
'320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', |
|||
'6124b4c8570aa390c21fafd04a26c69f' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', |
|||
); |
|||
|
|||
public static $prefixLengthsPsr4 = array ( |
|||
'p' => |
|||
array ( |
|||
'phpDocumentor\\Reflection\\' => 25, |
|||
), |
|||
'W' => |
|||
array ( |
|||
'Webmozart\\Assert\\' => 17, |
|||
), |
|||
'S' => |
|||
array ( |
|||
'Symfony\\Polyfill\\Ctype\\' => 23, |
|||
'Symfony\\Component\\Yaml\\' => 23, |
|||
), |
|||
'P' => |
|||
array ( |
|||
'Prophecy\\' => 9, |
|||
), |
|||
'D' => |
|||
array ( |
|||
'Doctrine\\Instantiator\\' => 22, |
|||
'DeepCopy\\' => 9, |
|||
), |
|||
); |
|||
|
|||
public static $prefixDirsPsr4 = array ( |
|||
'phpDocumentor\\Reflection\\' => |
|||
array ( |
|||
0 => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src', |
|||
1 => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src', |
|||
2 => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src', |
|||
), |
|||
'Webmozart\\Assert\\' => |
|||
array ( |
|||
0 => __DIR__ . '/..' . '/webmozart/assert/src', |
|||
), |
|||
'Symfony\\Polyfill\\Ctype\\' => |
|||
array ( |
|||
0 => __DIR__ . '/..' . '/symfony/polyfill-ctype', |
|||
), |
|||
'Symfony\\Component\\Yaml\\' => |
|||
array ( |
|||
0 => __DIR__ . '/..' . '/symfony/yaml', |
|||
), |
|||
'Prophecy\\' => |
|||
array ( |
|||
0 => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy', |
|||
), |
|||
'Doctrine\\Instantiator\\' => |
|||
array ( |
|||
0 => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator', |
|||
), |
|||
'DeepCopy\\' => |
|||
array ( |
|||
0 => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy', |
|||
), |
|||
); |
|||
|
|||
public static $classMap = array ( |
|||
'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', |
|||
'File_Iterator' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Iterator.php', |
|||
'File_Iterator_Facade' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Facade.php', |
|||
'File_Iterator_Factory' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Factory.php', |
|||
'PHPUnit\\Framework\\Assert' => __DIR__ . '/..' . '/phpunit/phpunit/src/ForwardCompatibility/Assert.php', |
|||
'PHPUnit\\Framework\\AssertionFailedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/ForwardCompatibility/AssertionFailedError.php', |
|||
'PHPUnit\\Framework\\BaseTestListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/ForwardCompatibility/BaseTestListener.php', |
|||
'PHPUnit\\Framework\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/ForwardCompatibility/Test.php', |
|||
'PHPUnit\\Framework\\TestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/ForwardCompatibility/TestCase.php', |
|||
'PHPUnit\\Framework\\TestListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/ForwardCompatibility/TestListener.php', |
|||
'PHPUnit\\Framework\\TestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/ForwardCompatibility/TestSuite.php', |
|||
'PHPUnit_Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Exception.php', |
|||
'PHPUnit_Extensions_GroupTestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/GroupTestSuite.php', |
|||
'PHPUnit_Extensions_PhptTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/PhptTestCase.php', |
|||
'PHPUnit_Extensions_PhptTestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/PhptTestSuite.php', |
|||
'PHPUnit_Extensions_RepeatedTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/RepeatedTest.php', |
|||
'PHPUnit_Extensions_TestDecorator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/TestDecorator.php', |
|||
'PHPUnit_Extensions_TicketListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/TicketListener.php', |
|||
'PHPUnit_Framework_Assert' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert.php', |
|||
'PHPUnit_Framework_AssertionFailedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/AssertionFailedError.php', |
|||
'PHPUnit_Framework_BaseTestListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/BaseTestListener.php', |
|||
'PHPUnit_Framework_CodeCoverageException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/CodeCoverageException.php', |
|||
'PHPUnit_Framework_Constraint' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint.php', |
|||
'PHPUnit_Framework_Constraint_And' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/And.php', |
|||
'PHPUnit_Framework_Constraint_ArrayHasKey' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php', |
|||
'PHPUnit_Framework_Constraint_ArraySubset' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php', |
|||
'PHPUnit_Framework_Constraint_Attribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Attribute.php', |
|||
'PHPUnit_Framework_Constraint_Callback' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Callback.php', |
|||
'PHPUnit_Framework_Constraint_ClassHasAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php', |
|||
'PHPUnit_Framework_Constraint_ClassHasStaticAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php', |
|||
'PHPUnit_Framework_Constraint_Composite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Composite.php', |
|||
'PHPUnit_Framework_Constraint_Count' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Count.php', |
|||
'PHPUnit_Framework_Constraint_DirectoryExists' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/DirectoryExists.php', |
|||
'PHPUnit_Framework_Constraint_Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Exception.php', |
|||
'PHPUnit_Framework_Constraint_ExceptionCode' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php', |
|||
'PHPUnit_Framework_Constraint_ExceptionMessage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php', |
|||
'PHPUnit_Framework_Constraint_ExceptionMessageRegExp' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegExp.php', |
|||
'PHPUnit_Framework_Constraint_FileExists' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/FileExists.php', |
|||
'PHPUnit_Framework_Constraint_GreaterThan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php', |
|||
'PHPUnit_Framework_Constraint_IsAnything' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsAnything.php', |
|||
'PHPUnit_Framework_Constraint_IsEmpty' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php', |
|||
'PHPUnit_Framework_Constraint_IsEqual' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsEqual.php', |
|||
'PHPUnit_Framework_Constraint_IsFalse' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsFalse.php', |
|||
'PHPUnit_Framework_Constraint_IsFinite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsFinite.php', |
|||
'PHPUnit_Framework_Constraint_IsIdentical' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php', |
|||
'PHPUnit_Framework_Constraint_IsInfinite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsInfinite.php', |
|||
'PHPUnit_Framework_Constraint_IsInstanceOf' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php', |
|||
'PHPUnit_Framework_Constraint_IsJson' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsJson.php', |
|||
'PHPUnit_Framework_Constraint_IsNan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsNan.php', |
|||
'PHPUnit_Framework_Constraint_IsNull' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsNull.php', |
|||
'PHPUnit_Framework_Constraint_IsReadable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsReadable.php', |
|||
'PHPUnit_Framework_Constraint_IsTrue' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsTrue.php', |
|||
'PHPUnit_Framework_Constraint_IsType' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsType.php', |
|||
'PHPUnit_Framework_Constraint_IsWritable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsWritable.php', |
|||
'PHPUnit_Framework_Constraint_JsonMatches' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php', |
|||
'PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches/ErrorMessageProvider.php', |
|||
'PHPUnit_Framework_Constraint_LessThan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/LessThan.php', |
|||
'PHPUnit_Framework_Constraint_Not' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Not.php', |
|||
'PHPUnit_Framework_Constraint_ObjectHasAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php', |
|||
'PHPUnit_Framework_Constraint_Or' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Or.php', |
|||
'PHPUnit_Framework_Constraint_PCREMatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/PCREMatch.php', |
|||
'PHPUnit_Framework_Constraint_SameSize' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/SameSize.php', |
|||
'PHPUnit_Framework_Constraint_StringContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringContains.php', |
|||
'PHPUnit_Framework_Constraint_StringEndsWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php', |
|||
'PHPUnit_Framework_Constraint_StringMatches' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringMatches.php', |
|||
'PHPUnit_Framework_Constraint_StringStartsWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php', |
|||
'PHPUnit_Framework_Constraint_TraversableContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php', |
|||
'PHPUnit_Framework_Constraint_TraversableContainsOnly' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php', |
|||
'PHPUnit_Framework_Constraint_Xor' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Xor.php', |
|||
'PHPUnit_Framework_CoveredCodeNotExecutedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/CoveredCodeNotExecutedException.php', |
|||
'PHPUnit_Framework_Error' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error.php', |
|||
'PHPUnit_Framework_Error_Deprecated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Deprecated.php', |
|||
'PHPUnit_Framework_Error_Notice' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Notice.php', |
|||
'PHPUnit_Framework_Error_Warning' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Warning.php', |
|||
'PHPUnit_Framework_Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception.php', |
|||
'PHPUnit_Framework_ExceptionWrapper' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/ExceptionWrapper.php', |
|||
'PHPUnit_Framework_ExpectationFailedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/ExpectationFailedException.php', |
|||
'PHPUnit_Framework_IncompleteTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTest.php', |
|||
'PHPUnit_Framework_IncompleteTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTestCase.php', |
|||
'PHPUnit_Framework_IncompleteTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTestError.php', |
|||
'PHPUnit_Framework_InvalidCoversTargetException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/InvalidCoversTargetException.php', |
|||
'PHPUnit_Framework_MissingCoversAnnotationException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MissingCoversAnnotationException.php', |
|||
'PHPUnit_Framework_MockObject_BadMethodCallException' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/BadMethodCallException.php', |
|||
'PHPUnit_Framework_MockObject_Builder_Identity' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Identity.php', |
|||
'PHPUnit_Framework_MockObject_Builder_InvocationMocker' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/InvocationMocker.php', |
|||
'PHPUnit_Framework_MockObject_Builder_Match' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Match.php', |
|||
'PHPUnit_Framework_MockObject_Builder_MethodNameMatch' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/MethodNameMatch.php', |
|||
'PHPUnit_Framework_MockObject_Builder_Namespace' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Namespace.php', |
|||
'PHPUnit_Framework_MockObject_Builder_ParametersMatch' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/ParametersMatch.php', |
|||
'PHPUnit_Framework_MockObject_Builder_Stub' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Stub.php', |
|||
'PHPUnit_Framework_MockObject_Exception' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/Exception.php', |
|||
'PHPUnit_Framework_MockObject_Generator' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator.php', |
|||
'PHPUnit_Framework_MockObject_Invocation' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation.php', |
|||
'PHPUnit_Framework_MockObject_InvocationMocker' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/InvocationMocker.php', |
|||
'PHPUnit_Framework_MockObject_Invocation_Object' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation/Object.php', |
|||
'PHPUnit_Framework_MockObject_Invocation_Static' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation/Static.php', |
|||
'PHPUnit_Framework_MockObject_Invokable' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invokable.php', |
|||
'PHPUnit_Framework_MockObject_Matcher' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/AnyInvokedCount.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_AnyParameters' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/AnyParameters.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_ConsecutiveParameters' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/ConsecutiveParameters.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_Invocation' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/Invocation.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtIndex.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtLeastCount.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtLeastOnce.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_InvokedAtMostCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtMostCount.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_InvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedCount.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_InvokedRecorder' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedRecorder.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_MethodName' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/MethodName.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_Parameters' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/Parameters.php', |
|||
'PHPUnit_Framework_MockObject_Matcher_StatelessInvocation' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/StatelessInvocation.php', |
|||
'PHPUnit_Framework_MockObject_MockBuilder' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/MockBuilder.php', |
|||
'PHPUnit_Framework_MockObject_MockObject' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/MockObject.php', |
|||
'PHPUnit_Framework_MockObject_RuntimeException' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/RuntimeException.php', |
|||
'PHPUnit_Framework_MockObject_Stub' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub.php', |
|||
'PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ConsecutiveCalls.php', |
|||
'PHPUnit_Framework_MockObject_Stub_Exception' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/Exception.php', |
|||
'PHPUnit_Framework_MockObject_Stub_MatcherCollection' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/MatcherCollection.php', |
|||
'PHPUnit_Framework_MockObject_Stub_Return' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/Return.php', |
|||
'PHPUnit_Framework_MockObject_Stub_ReturnArgument' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnArgument.php', |
|||
'PHPUnit_Framework_MockObject_Stub_ReturnCallback' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnCallback.php', |
|||
'PHPUnit_Framework_MockObject_Stub_ReturnReference' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnReference.php', |
|||
'PHPUnit_Framework_MockObject_Stub_ReturnSelf' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnSelf.php', |
|||
'PHPUnit_Framework_MockObject_Stub_ReturnValueMap' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnValueMap.php', |
|||
'PHPUnit_Framework_MockObject_Verifiable' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Verifiable.php', |
|||
'PHPUnit_Framework_OutputError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/OutputError.php', |
|||
'PHPUnit_Framework_RiskyTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/RiskyTest.php', |
|||
'PHPUnit_Framework_RiskyTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/RiskyTestError.php', |
|||
'PHPUnit_Framework_SelfDescribing' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SelfDescribing.php', |
|||
'PHPUnit_Framework_SkippedTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTest.php', |
|||
'PHPUnit_Framework_SkippedTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTestCase.php', |
|||
'PHPUnit_Framework_SkippedTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTestError.php', |
|||
'PHPUnit_Framework_SkippedTestSuiteError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTestSuiteError.php', |
|||
'PHPUnit_Framework_SyntheticError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SyntheticError.php', |
|||
'PHPUnit_Framework_Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Test.php', |
|||
'PHPUnit_Framework_TestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestCase.php', |
|||
'PHPUnit_Framework_TestFailure' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestFailure.php', |
|||
'PHPUnit_Framework_TestListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestListener.php', |
|||
'PHPUnit_Framework_TestResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestResult.php', |
|||
'PHPUnit_Framework_TestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSuite.php', |
|||
'PHPUnit_Framework_TestSuite_DataProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSuite/DataProvider.php', |
|||
'PHPUnit_Framework_UnintentionallyCoveredCodeError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/UnintentionallyCoveredCodeError.php', |
|||
'PHPUnit_Framework_Warning' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Warning.php', |
|||
'PHPUnit_Framework_WarningTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/WarningTestCase.php', |
|||
'PHPUnit_Runner_BaseTestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/BaseTestRunner.php', |
|||
'PHPUnit_Runner_Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception.php', |
|||
'PHPUnit_Runner_Filter_Factory' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Factory.php', |
|||
'PHPUnit_Runner_Filter_GroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Group.php', |
|||
'PHPUnit_Runner_Filter_Group_Exclude' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Group/Exclude.php', |
|||
'PHPUnit_Runner_Filter_Group_Include' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Group/Include.php', |
|||
'PHPUnit_Runner_Filter_Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Test.php', |
|||
'PHPUnit_Runner_StandardTestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php', |
|||
'PHPUnit_Runner_TestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php', |
|||
'PHPUnit_Runner_Version' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Version.php', |
|||
'PHPUnit_TextUI_Command' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command.php', |
|||
'PHPUnit_TextUI_ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/ResultPrinter.php', |
|||
'PHPUnit_TextUI_TestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/TestRunner.php', |
|||
'PHPUnit_Util_Blacklist' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Blacklist.php', |
|||
'PHPUnit_Util_Configuration' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Configuration.php', |
|||
'PHPUnit_Util_ConfigurationGenerator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ConfigurationGenerator.php', |
|||
'PHPUnit_Util_ErrorHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ErrorHandler.php', |
|||
'PHPUnit_Util_Fileloader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Fileloader.php', |
|||
'PHPUnit_Util_Filesystem' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filesystem.php', |
|||
'PHPUnit_Util_Filter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filter.php', |
|||
'PHPUnit_Util_Getopt' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Getopt.php', |
|||
'PHPUnit_Util_GlobalState' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/GlobalState.php', |
|||
'PHPUnit_Util_InvalidArgumentHelper' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/InvalidArgumentHelper.php', |
|||
'PHPUnit_Util_Log_JSON' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/JSON.php', |
|||
'PHPUnit_Util_Log_JUnit' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/JUnit.php', |
|||
'PHPUnit_Util_Log_TAP' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/TAP.php', |
|||
'PHPUnit_Util_Log_TeamCity' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/TeamCity.php', |
|||
'PHPUnit_Util_PHP' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP.php', |
|||
'PHPUnit_Util_PHP_Default' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/Default.php', |
|||
'PHPUnit_Util_PHP_Windows' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/Windows.php', |
|||
'PHPUnit_Util_Printer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Printer.php', |
|||
'PHPUnit_Util_Regex' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Regex.php', |
|||
'PHPUnit_Util_String' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/String.php', |
|||
'PHPUnit_Util_Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Test.php', |
|||
'PHPUnit_Util_TestDox_NamePrettifier' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php', |
|||
'PHPUnit_Util_TestDox_ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php', |
|||
'PHPUnit_Util_TestDox_ResultPrinter_HTML' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/HTML.php', |
|||
'PHPUnit_Util_TestDox_ResultPrinter_Text' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/Text.php', |
|||
'PHPUnit_Util_TestDox_ResultPrinter_XML' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/XML.php', |
|||
'PHPUnit_Util_TestSuiteIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestSuiteIterator.php', |
|||
'PHPUnit_Util_Type' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Type.php', |
|||
'PHPUnit_Util_XML' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/XML.php', |
|||
'PHP_Timer' => __DIR__ . '/..' . '/phpunit/php-timer/src/Timer.php', |
|||
'PHP_Token' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_TokenWithScope' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_TokenWithScopeAndVisibility' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ABSTRACT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_AMPERSAND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_AND_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ARRAY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ARRAY_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_AS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ASYNC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_AT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_AWAIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_BACKTICK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_BAD_CHARACTER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_BOOLEAN_AND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_BOOLEAN_OR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_BOOL_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_BREAK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CALLABLE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CARET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CASE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CATCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CHARACTER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CLASS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CLASS_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CLASS_NAME_CONSTANT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CLONE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CLOSE_BRACKET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CLOSE_CURLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CLOSE_SQUARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CLOSE_TAG' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_COALESCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_COLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_COMMA' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_COMMENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_COMPILER_HALT_OFFSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CONCAT_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CONST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CONSTANT_ENCAPSED_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CONTINUE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_CURLY_OPEN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DEC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DECLARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DEFAULT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DIR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DIV' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DIV_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DNUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DOC_COMMENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DOLLAR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DOLLAR_OPEN_CURLY_BRACES' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DOT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DOUBLE_ARROW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DOUBLE_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DOUBLE_COLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_DOUBLE_QUOTES' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ECHO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ELLIPSIS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ELSE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ELSEIF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_EMPTY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ENCAPSED_AND_WHITESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ENDDECLARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ENDFOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ENDFOREACH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ENDIF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ENDSWITCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ENDWHILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_END_HEREDOC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ENUM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_EQUALS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_EVAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_EXCLAMATION_MARK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_EXIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_EXTENDS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_FILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_FINAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_FINALLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_FOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_FOREACH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_FUNCTION' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_FUNC_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_GLOBAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_GOTO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_GT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_HALT_COMPILER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_IF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_IMPLEMENTS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_IN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_INC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_INCLUDE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_INCLUDE_ONCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_INLINE_HTML' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_INSTANCEOF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_INSTEADOF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_INTERFACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_INT_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ISSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_IS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_IS_GREATER_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_IS_IDENTICAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_IS_NOT_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_IS_NOT_IDENTICAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_IS_SMALLER_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_Includes' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_JOIN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_LAMBDA_ARROW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_LAMBDA_CP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_LAMBDA_OP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_LINE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_LIST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_LNUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_LOGICAL_AND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_LOGICAL_OR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_LOGICAL_XOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_LT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_METHOD_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_MINUS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_MINUS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_MOD_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_MULT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_MUL_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_NAMESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_NEW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_NS_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_NS_SEPARATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_NULLSAFE_OBJECT_OPERATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_NUM_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_OBJECT_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_OBJECT_OPERATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_ONUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_OPEN_BRACKET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_OPEN_CURLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_OPEN_SQUARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_OPEN_TAG' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_OPEN_TAG_WITH_ECHO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_PAAMAYIM_NEKUDOTAYIM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_PERCENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_PIPE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_PLUS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_PLUS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_POW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_POW_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_PRINT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_PRIVATE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_PROTECTED' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_PUBLIC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_QUESTION_MARK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_REQUIRE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_REQUIRE_ONCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_RETURN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_SEMICOLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_SHAPE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_SL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_SL_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_SPACESHIP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_SR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_SR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_START_HEREDOC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_STATIC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_STRING_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_STRING_VARNAME' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_SUPER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_SWITCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_Stream' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Stream.php', |
|||
'PHP_Token_Stream_CachingFactory' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php', |
|||
'PHP_Token_THROW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_TILDE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_TRAIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_TRAIT_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_TRY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_TYPE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_TYPELIST_GT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_TYPELIST_LT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_UNSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_UNSET_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_USE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_USE_FUNCTION' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_VAR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_VARIABLE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_WHERE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_WHILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_WHITESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_XHP_ATTRIBUTE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_XHP_CATEGORY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_XHP_CATEGORY_LABEL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_XHP_CHILDREN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_XHP_LABEL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_XHP_REQUIRED' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_XHP_TAG_GT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_XHP_TAG_LT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_XHP_TEXT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_XOR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_YIELD' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'PHP_Token_YIELD_FROM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', |
|||
'SebastianBergmann\\CodeCoverage\\CodeCoverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage.php', |
|||
'SebastianBergmann\\CodeCoverage\\CoveredCodeNotExecutedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php', |
|||
'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Driver.php', |
|||
'SebastianBergmann\\CodeCoverage\\Driver\\HHVM' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/HHVM.php', |
|||
'SebastianBergmann\\CodeCoverage\\Driver\\PHPDBG' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/PHPDBG.php', |
|||
'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Xdebug.php', |
|||
'SebastianBergmann\\CodeCoverage\\Exception' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/Exception.php', |
|||
'SebastianBergmann\\CodeCoverage\\Filter' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Filter.php', |
|||
'SebastianBergmann\\CodeCoverage\\InvalidArgumentException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php', |
|||
'SebastianBergmann\\CodeCoverage\\MissingCoversAnnotationException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/MissingCoversAnnotationException.php', |
|||
'SebastianBergmann\\CodeCoverage\\Node\\AbstractNode' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/AbstractNode.php', |
|||
'SebastianBergmann\\CodeCoverage\\Node\\Builder' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Builder.php', |
|||
'SebastianBergmann\\CodeCoverage\\Node\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Directory.php', |
|||
'SebastianBergmann\\CodeCoverage\\Node\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/File.php', |
|||
'SebastianBergmann\\CodeCoverage\\Node\\Iterator' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Iterator.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Clover' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Clover.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Crap4j' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Crap4j.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Html\\Dashboard' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Html\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Html\\Facade' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Facade.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Html\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Html\\Renderer' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\PHP' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/PHP.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Text' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Text.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Coverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Coverage.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Directory.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Facade' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Facade.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Xml\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/File.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Method' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Method.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Node' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Node.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Project' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Project.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Report' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Report.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Tests' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Tests.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Totals' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Totals.php', |
|||
'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Unit' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Unit.php', |
|||
'SebastianBergmann\\CodeCoverage\\RuntimeException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/RuntimeException.php', |
|||
'SebastianBergmann\\CodeCoverage\\UnintentionallyCoveredCodeException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php', |
|||
'SebastianBergmann\\CodeCoverage\\Util' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Util.php', |
|||
'SebastianBergmann\\CodeUnitReverseLookup\\Wizard' => __DIR__ . '/..' . '/sebastian/code-unit-reverse-lookup/src/Wizard.php', |
|||
'SebastianBergmann\\Comparator\\ArrayComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ArrayComparator.php', |
|||
'SebastianBergmann\\Comparator\\Comparator' => __DIR__ . '/..' . '/sebastian/comparator/src/Comparator.php', |
|||
'SebastianBergmann\\Comparator\\ComparisonFailure' => __DIR__ . '/..' . '/sebastian/comparator/src/ComparisonFailure.php', |
|||
'SebastianBergmann\\Comparator\\DOMNodeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DOMNodeComparator.php', |
|||
'SebastianBergmann\\Comparator\\DateTimeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DateTimeComparator.php', |
|||
'SebastianBergmann\\Comparator\\DoubleComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DoubleComparator.php', |
|||
'SebastianBergmann\\Comparator\\ExceptionComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ExceptionComparator.php', |
|||
'SebastianBergmann\\Comparator\\Factory' => __DIR__ . '/..' . '/sebastian/comparator/src/Factory.php', |
|||
'SebastianBergmann\\Comparator\\MockObjectComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/MockObjectComparator.php', |
|||
'SebastianBergmann\\Comparator\\NumericComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/NumericComparator.php', |
|||
'SebastianBergmann\\Comparator\\ObjectComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ObjectComparator.php', |
|||
'SebastianBergmann\\Comparator\\ResourceComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ResourceComparator.php', |
|||
'SebastianBergmann\\Comparator\\ScalarComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ScalarComparator.php', |
|||
'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/SplObjectStorageComparator.php', |
|||
'SebastianBergmann\\Comparator\\TypeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/TypeComparator.php', |
|||
'SebastianBergmann\\Diff\\Chunk' => __DIR__ . '/..' . '/sebastian/diff/src/Chunk.php', |
|||
'SebastianBergmann\\Diff\\Diff' => __DIR__ . '/..' . '/sebastian/diff/src/Diff.php', |
|||
'SebastianBergmann\\Diff\\Differ' => __DIR__ . '/..' . '/sebastian/diff/src/Differ.php', |
|||
'SebastianBergmann\\Diff\\LCS\\LongestCommonSubsequence' => __DIR__ . '/..' . '/sebastian/diff/src/LCS/LongestCommonSubsequence.php', |
|||
'SebastianBergmann\\Diff\\LCS\\MemoryEfficientImplementation' => __DIR__ . '/..' . '/sebastian/diff/src/LCS/MemoryEfficientLongestCommonSubsequenceImplementation.php', |
|||
'SebastianBergmann\\Diff\\LCS\\TimeEfficientImplementation' => __DIR__ . '/..' . '/sebastian/diff/src/LCS/TimeEfficientLongestCommonSubsequenceImplementation.php', |
|||
'SebastianBergmann\\Diff\\Line' => __DIR__ . '/..' . '/sebastian/diff/src/Line.php', |
|||
'SebastianBergmann\\Diff\\Parser' => __DIR__ . '/..' . '/sebastian/diff/src/Parser.php', |
|||
'SebastianBergmann\\Environment\\Console' => __DIR__ . '/..' . '/sebastian/environment/src/Console.php', |
|||
'SebastianBergmann\\Environment\\Runtime' => __DIR__ . '/..' . '/sebastian/environment/src/Runtime.php', |
|||
'SebastianBergmann\\Exporter\\Exporter' => __DIR__ . '/..' . '/sebastian/exporter/src/Exporter.php', |
|||
'SebastianBergmann\\GlobalState\\Blacklist' => __DIR__ . '/..' . '/sebastian/global-state/src/Blacklist.php', |
|||
'SebastianBergmann\\GlobalState\\CodeExporter' => __DIR__ . '/..' . '/sebastian/global-state/src/CodeExporter.php', |
|||
'SebastianBergmann\\GlobalState\\Exception' => __DIR__ . '/..' . '/sebastian/global-state/src/Exception.php', |
|||
'SebastianBergmann\\GlobalState\\Restorer' => __DIR__ . '/..' . '/sebastian/global-state/src/Restorer.php', |
|||
'SebastianBergmann\\GlobalState\\RuntimeException' => __DIR__ . '/..' . '/sebastian/global-state/src/RuntimeException.php', |
|||
'SebastianBergmann\\GlobalState\\Snapshot' => __DIR__ . '/..' . '/sebastian/global-state/src/Snapshot.php', |
|||
'SebastianBergmann\\ObjectEnumerator\\Enumerator' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/Enumerator.php', |
|||
'SebastianBergmann\\ObjectEnumerator\\Exception' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/Exception.php', |
|||
'SebastianBergmann\\ObjectEnumerator\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/InvalidArgumentException.php', |
|||
'SebastianBergmann\\RecursionContext\\Context' => __DIR__ . '/..' . '/sebastian/recursion-context/src/Context.php', |
|||
'SebastianBergmann\\RecursionContext\\Exception' => __DIR__ . '/..' . '/sebastian/recursion-context/src/Exception.php', |
|||
'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/recursion-context/src/InvalidArgumentException.php', |
|||
'SebastianBergmann\\ResourceOperations\\ResourceOperations' => __DIR__ . '/..' . '/sebastian/resource-operations/src/ResourceOperations.php', |
|||
'SebastianBergmann\\Version' => __DIR__ . '/..' . '/sebastian/version/src/Version.php', |
|||
'Text_Template' => __DIR__ . '/..' . '/phpunit/php-text-template/src/Template.php', |
|||
); |
|||
|
|||
public static function getInitializer(ClassLoader $loader) |
|||
{ |
|||
return \Closure::bind(function () use ($loader) { |
|||
$loader->prefixLengthsPsr4 = ComposerStaticInit1eb0bd8b9bd803db01b2c2a0cd8b9817::$prefixLengthsPsr4; |
|||
$loader->prefixDirsPsr4 = ComposerStaticInit1eb0bd8b9bd803db01b2c2a0cd8b9817::$prefixDirsPsr4; |
|||
$loader->classMap = ComposerStaticInit1eb0bd8b9bd803db01b2c2a0cd8b9817::$classMap; |
|||
|
|||
}, null, ClassLoader::class); |
|||
} |
|||
} |
File diff suppressed because it is too large
@ -0,0 +1,262 @@ |
|||
<?php return array ( |
|||
'root' => |
|||
array ( |
|||
'pretty_version' => 'dev-config', |
|||
'version' => 'dev-config', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '2eaf359bcdee9c74098c35ebfddaa5f6870b0907', |
|||
'name' => '__root__', |
|||
), |
|||
'versions' => |
|||
array ( |
|||
'__root__' => |
|||
array ( |
|||
'pretty_version' => 'dev-config', |
|||
'version' => 'dev-config', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '2eaf359bcdee9c74098c35ebfddaa5f6870b0907', |
|||
), |
|||
'doctrine/instantiator' => |
|||
array ( |
|||
'pretty_version' => '1.4.0', |
|||
'version' => '1.4.0.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => 'd56bf6102915de5702778fe20f2de3b2fe570b5b', |
|||
), |
|||
'myclabs/deep-copy' => |
|||
array ( |
|||
'pretty_version' => '1.10.2', |
|||
'version' => '1.10.2.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '776f831124e9c62e1a2c601ecc52e776d8bb7220', |
|||
'replaced' => |
|||
array ( |
|||
0 => '1.10.2', |
|||
), |
|||
), |
|||
'phpdocumentor/reflection-common' => |
|||
array ( |
|||
'pretty_version' => '2.2.0', |
|||
'version' => '2.2.0.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b', |
|||
), |
|||
'phpdocumentor/reflection-docblock' => |
|||
array ( |
|||
'pretty_version' => '5.2.2', |
|||
'version' => '5.2.2.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '069a785b2141f5bcf49f3e353548dc1cce6df556', |
|||
), |
|||
'phpdocumentor/type-resolver' => |
|||
array ( |
|||
'pretty_version' => '1.4.0', |
|||
'version' => '1.4.0.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0', |
|||
), |
|||
'phpspec/prophecy' => |
|||
array ( |
|||
'pretty_version' => 'v1.10.3', |
|||
'version' => '1.10.3.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '451c3cd1418cf640de218914901e51b064abb093', |
|||
), |
|||
'phpunit/php-code-coverage' => |
|||
array ( |
|||
'pretty_version' => '4.0.8', |
|||
'version' => '4.0.8.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => 'ef7b2f56815df854e66ceaee8ebe9393ae36a40d', |
|||
), |
|||
'phpunit/php-file-iterator' => |
|||
array ( |
|||
'pretty_version' => '1.4.5', |
|||
'version' => '1.4.5.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '730b01bc3e867237eaac355e06a36b85dd93a8b4', |
|||
), |
|||
'phpunit/php-text-template' => |
|||
array ( |
|||
'pretty_version' => '1.2.1', |
|||
'version' => '1.2.1.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '31f8b717e51d9a2afca6c9f046f5d69fc27c8686', |
|||
), |
|||
'phpunit/php-timer' => |
|||
array ( |
|||
'pretty_version' => '1.0.9', |
|||
'version' => '1.0.9.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '3dcf38ca72b158baf0bc245e9184d3fdffa9c46f', |
|||
), |
|||
'phpunit/php-token-stream' => |
|||
array ( |
|||
'pretty_version' => '2.0.2', |
|||
'version' => '2.0.2.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '791198a2c6254db10131eecfe8c06670700904db', |
|||
), |
|||
'phpunit/phpunit' => |
|||
array ( |
|||
'pretty_version' => '5.7.27', |
|||
'version' => '5.7.27.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => 'b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c', |
|||
), |
|||
'phpunit/phpunit-mock-objects' => |
|||
array ( |
|||
'pretty_version' => '3.4.4', |
|||
'version' => '3.4.4.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => 'a23b761686d50a560cc56233b9ecf49597cc9118', |
|||
), |
|||
'sebastian/code-unit-reverse-lookup' => |
|||
array ( |
|||
'pretty_version' => '1.0.2', |
|||
'version' => '1.0.2.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '1de8cd5c010cb153fcd68b8d0f64606f523f7619', |
|||
), |
|||
'sebastian/comparator' => |
|||
array ( |
|||
'pretty_version' => '1.2.4', |
|||
'version' => '1.2.4.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '2b7424b55f5047b47ac6e5ccb20b2aea4011d9be', |
|||
), |
|||
'sebastian/diff' => |
|||
array ( |
|||
'pretty_version' => '1.4.3', |
|||
'version' => '1.4.3.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '7f066a26a962dbe58ddea9f72a4e82874a3975a4', |
|||
), |
|||
'sebastian/environment' => |
|||
array ( |
|||
'pretty_version' => '2.0.0', |
|||
'version' => '2.0.0.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '5795ffe5dc5b02460c3e34222fee8cbe245d8fac', |
|||
), |
|||
'sebastian/exporter' => |
|||
array ( |
|||
'pretty_version' => '2.0.0', |
|||
'version' => '2.0.0.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => 'ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4', |
|||
), |
|||
'sebastian/global-state' => |
|||
array ( |
|||
'pretty_version' => '1.1.1', |
|||
'version' => '1.1.1.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => 'bc37d50fea7d017d3d340f230811c9f1d7280af4', |
|||
), |
|||
'sebastian/object-enumerator' => |
|||
array ( |
|||
'pretty_version' => '2.0.1', |
|||
'version' => '2.0.1.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '1311872ac850040a79c3c058bea3e22d0f09cbb7', |
|||
), |
|||
'sebastian/recursion-context' => |
|||
array ( |
|||
'pretty_version' => '2.0.0', |
|||
'version' => '2.0.0.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '2c3ba150cbec723aa057506e73a8d33bdb286c9a', |
|||
), |
|||
'sebastian/resource-operations' => |
|||
array ( |
|||
'pretty_version' => '1.0.0', |
|||
'version' => '1.0.0.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => 'ce990bb21759f94aeafd30209e8cfcdfa8bc3f52', |
|||
), |
|||
'sebastian/version' => |
|||
array ( |
|||
'pretty_version' => '2.0.1', |
|||
'version' => '2.0.1.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => '99732be0ddb3361e16ad77b68ba41efc8e979019', |
|||
), |
|||
'symfony/polyfill-ctype' => |
|||
array ( |
|||
'pretty_version' => 'v1.20.0', |
|||
'version' => '1.20.0.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => 'f4ba089a5b6366e453971d3aad5fe8e897b37f41', |
|||
), |
|||
'symfony/yaml' => |
|||
array ( |
|||
'pretty_version' => 'v4.4.18', |
|||
'version' => '4.4.18.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => 'bbce94f14d73732340740366fcbe63363663a403', |
|||
), |
|||
'webmozart/assert' => |
|||
array ( |
|||
'pretty_version' => '1.9.1', |
|||
'version' => '1.9.1.0', |
|||
'aliases' => |
|||
array ( |
|||
), |
|||
'reference' => 'bafc69caeb4d49c39fd0779086c03a3738cbb389', |
|||
), |
|||
), |
|||
); |
@ -0,0 +1,26 @@ |
|||
<?php |
|||
|
|||
// platform_check.php @generated by Composer |
|||
|
|||
$issues = array(); |
|||
|
|||
if (!(PHP_VERSION_ID >= 70200)) { |
|||
$issues[] = 'Your Composer dependencies require a PHP version ">= 7.2.0". You are running ' . PHP_VERSION . '.'; |
|||
} |
|||
|
|||
if ($issues) { |
|||
if (!headers_sent()) { |
|||
header('HTTP/1.1 500 Internal Server Error'); |
|||
} |
|||
if (!ini_get('display_errors')) { |
|||
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { |
|||
fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); |
|||
} elseif (!headers_sent()) { |
|||
echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; |
|||
} |
|||
} |
|||
trigger_error( |
|||
'Composer detected issues in your platform: ' . implode(' ', $issues), |
|||
E_USER_ERROR |
|||
); |
|||
} |
@ -0,0 +1,41 @@ |
|||
{ |
|||
"active": true, |
|||
"name": "Instantiator", |
|||
"slug": "instantiator", |
|||
"docsSlug": "doctrine-instantiator", |
|||
"codePath": "/src", |
|||
"versions": [ |
|||
{ |
|||
"name": "1.4", |
|||
"branchName": "master", |
|||
"slug": "latest", |
|||
"upcoming": true |
|||
}, |
|||
{ |
|||
"name": "1.3", |
|||
"branchName": "1.3.x", |
|||
"slug": "1.3", |
|||
"aliases": [ |
|||
"current", |
|||
"stable" |
|||
], |
|||
"maintained": true, |
|||
"current": true |
|||
}, |
|||
{ |
|||
"name": "1.2", |
|||
"branchName": "1.2.x", |
|||
"slug": "1.2" |
|||
}, |
|||
{ |
|||
"name": "1.1", |
|||
"branchName": "1.1.x", |
|||
"slug": "1.1" |
|||
}, |
|||
{ |
|||
"name": "1.0", |
|||
"branchName": "1.0.x", |
|||
"slug": "1.0" |
|||
} |
|||
] |
|||
} |
@ -0,0 +1,3 @@ |
|||
patreon: phpdoctrine |
|||
tidelift: packagist/doctrine%2Finstantiator |
|||
custom: https://www.doctrine-project.org/sponsorship.html |
@ -0,0 +1,48 @@ |
|||
|
|||
name: "Coding Standards" |
|||
|
|||
on: |
|||
pull_request: |
|||
branches: |
|||
- "*.x" |
|||
push: |
|||
branches: |
|||
- "*.x" |
|||
|
|||
env: |
|||
COMPOSER_ROOT_VERSION: "1.4" |
|||
|
|||
jobs: |
|||
coding-standards: |
|||
name: "Coding Standards" |
|||
runs-on: "ubuntu-20.04" |
|||
|
|||
strategy: |
|||
matrix: |
|||
php-version: |
|||
- "7.4" |
|||
|
|||
steps: |
|||
- name: "Checkout" |
|||
uses: "actions/checkout@v2" |
|||
|
|||
- name: "Install PHP" |
|||
uses: "shivammathur/setup-php@v2" |
|||
with: |
|||
coverage: "none" |
|||
php-version: "${{ matrix.php-version }}" |
|||
tools: "cs2pr" |
|||
|
|||
- name: "Cache dependencies installed with Composer" |
|||
uses: "actions/cache@v2" |
|||
with: |
|||
path: "~/.composer/cache" |
|||
key: "php-${{ matrix.php-version }}-composer-locked-${{ hashFiles('composer.lock') }}" |
|||
restore-keys: "php-${{ matrix.php-version }}-composer-locked-" |
|||
|
|||
- name: "Install dependencies with Composer" |
|||
run: "composer install --no-interaction --no-progress" |
|||
|
|||
# https://github.com/doctrine/.github/issues/3 |
|||
- name: "Run PHP_CodeSniffer" |
|||
run: "vendor/bin/phpcs -q --no-colors --report=checkstyle | cs2pr" |
@ -0,0 +1,91 @@ |
|||
|
|||
name: "Continuous Integration" |
|||
|
|||
on: |
|||
pull_request: |
|||
branches: |
|||
- "*.x" |
|||
push: |
|||
branches: |
|||
- "*.x" |
|||
|
|||
env: |
|||
fail-fast: true |
|||
COMPOSER_ROOT_VERSION: "1.4" |
|||
|
|||
jobs: |
|||
phpunit: |
|||
name: "PHPUnit with SQLite" |
|||
runs-on: "ubuntu-20.04" |
|||
|
|||
strategy: |
|||
matrix: |
|||
php-version: |
|||
- "7.1" |
|||
- "7.2" |
|||
- "7.3" |
|||
- "7.4" |
|||
- "8.0" |
|||
|
|||
steps: |
|||
- name: "Checkout" |
|||
uses: "actions/checkout@v2" |
|||
with: |
|||
fetch-depth: 2 |
|||
|
|||
- name: "Install PHP with XDebug" |
|||
uses: "shivammathur/setup-php@v2" |
|||
if: "${{ matrix.php-version == '7.1' }}" |
|||
with: |
|||
php-version: "${{ matrix.php-version }}" |
|||
coverage: "xdebug" |
|||
ini-values: "zend.assertions=1" |
|||
|
|||
- name: "Install PHP with PCOV" |
|||
uses: "shivammathur/setup-php@v2" |
|||
if: "${{ matrix.php-version != '7.1' }}" |
|||
with: |
|||
php-version: "${{ matrix.php-version }}" |
|||
coverage: "pcov" |
|||
ini-values: "zend.assertions=1" |
|||
|
|||
- name: "Cache dependencies installed with composer" |
|||
uses: "actions/cache@v2" |
|||
with: |
|||
path: "~/.composer/cache" |
|||
key: "php-${{ matrix.php-version }}-composer-locked-${{ hashFiles('composer.lock') }}" |
|||
restore-keys: "php-${{ matrix.php-version }}-composer-locked-" |
|||
|
|||
- name: "Install dependencies with composer" |
|||
run: "composer update --no-interaction --no-progress" |
|||
|
|||
- name: "Run PHPUnit" |
|||
run: "vendor/bin/phpunit --coverage-clover=coverage.xml" |
|||
|
|||
- name: "Upload coverage file" |
|||
uses: "actions/upload-artifact@v2" |
|||
with: |
|||
name: "phpunit-${{ matrix.php-version }}.coverage" |
|||
path: "coverage.xml" |
|||
|
|||
upload_coverage: |
|||
name: "Upload coverage to Codecov" |
|||
runs-on: "ubuntu-20.04" |
|||
needs: |
|||
- "phpunit" |
|||
|
|||
steps: |
|||
- name: "Checkout" |
|||
uses: "actions/checkout@v2" |
|||
with: |
|||
fetch-depth: 2 |
|||
|
|||
- name: "Download coverage files" |
|||
uses: "actions/download-artifact@v2" |
|||
with: |
|||
path: "reports" |
|||
|
|||
- name: "Upload to Codecov" |
|||
uses: "codecov/codecov-action@v1" |
|||
with: |
|||
directory: reports |
@ -0,0 +1,50 @@ |
|||
|
|||
name: "Performance benchmark" |
|||
|
|||
on: |
|||
pull_request: |
|||
branches: |
|||
- "*.x" |
|||
push: |
|||
branches: |
|||
- "*.x" |
|||
|
|||
env: |
|||
fail-fast: true |
|||
COMPOSER_ROOT_VERSION: "1.4" |
|||
|
|||
jobs: |
|||
phpbench: |
|||
name: "PHPBench" |
|||
runs-on: "ubuntu-20.04" |
|||
|
|||
strategy: |
|||
matrix: |
|||
php-version: |
|||
- "7.4" |
|||
|
|||
steps: |
|||
- name: "Checkout" |
|||
uses: "actions/checkout@v2" |
|||
with: |
|||
fetch-depth: 2 |
|||
|
|||
- name: "Install PHP" |
|||
uses: "shivammathur/setup-php@v2" |
|||
with: |
|||
php-version: "${{ matrix.php-version }}" |
|||
coverage: "pcov" |
|||
ini-values: "zend.assertions=1" |
|||
|
|||
- name: "Cache dependencies installed with composer" |
|||
uses: "actions/cache@v2" |
|||
with: |
|||
path: "~/.composer/cache" |
|||
key: "php-${{ matrix.php-version }}-composer-locked-${{ hashFiles('composer.lock') }}" |
|||
restore-keys: "php-${{ matrix.php-version }}-composer-locked-" |
|||
|
|||
- name: "Install dependencies with composer" |
|||
run: "composer update --no-interaction --no-progress" |
|||
|
|||
- name: "Run PHPBench" |
|||
run: "php ./vendor/bin/phpbench run --iterations=3 --warmup=1 --report=aggregate" |
@ -0,0 +1,45 @@ |
|||
name: "Automatic Releases" |
|||
|
|||
on: |
|||
milestone: |
|||
types: |
|||
- "closed" |
|||
|
|||
jobs: |
|||
release: |
|||
name: "Git tag, release & create merge-up PR" |
|||
runs-on: "ubuntu-20.04" |
|||
|
|||
steps: |
|||
- name: "Checkout" |
|||
uses: "actions/checkout@v2" |
|||
|
|||
- name: "Release" |
|||
uses: "laminas/automatic-releases@v1" |
|||
with: |
|||
command-name: "laminas:automatic-releases:release" |
|||
env: |
|||
"GITHUB_TOKEN": ${{ secrets.GITHUB_TOKEN }} |
|||
"SIGNING_SECRET_KEY": ${{ secrets.SIGNING_SECRET_KEY }} |
|||
"GIT_AUTHOR_NAME": ${{ secrets.GIT_AUTHOR_NAME }} |
|||
"GIT_AUTHOR_EMAIL": ${{ secrets.GIT_AUTHOR_EMAIL }} |
|||
|
|||
- name: "Create Merge-Up Pull Request" |
|||
uses: "laminas/automatic-releases@v1" |
|||
with: |
|||
command-name: "laminas:automatic-releases:create-merge-up-pull-request" |
|||
env: |
|||
"GITHUB_TOKEN": ${{ secrets.GITHUB_TOKEN }} |
|||
"SIGNING_SECRET_KEY": ${{ secrets.SIGNING_SECRET_KEY }} |
|||
"GIT_AUTHOR_NAME": ${{ secrets.GIT_AUTHOR_NAME }} |
|||
"GIT_AUTHOR_EMAIL": ${{ secrets.GIT_AUTHOR_EMAIL }} |
|||
|
|||
- name: "Create new milestones" |
|||
uses: "laminas/automatic-releases@v1" |
|||
with: |
|||
command-name: "laminas:automatic-releases:create-milestones" |
|||
env: |
|||
"GITHUB_TOKEN": ${{ secrets.GITHUB_TOKEN }} |
|||
"SIGNING_SECRET_KEY": ${{ secrets.SIGNING_SECRET_KEY }} |
|||
"GIT_AUTHOR_NAME": ${{ secrets.GIT_AUTHOR_NAME }} |
|||
"GIT_AUTHOR_EMAIL": ${{ secrets.GIT_AUTHOR_EMAIL }} |
@ -0,0 +1,47 @@ |
|||
|
|||
name: "Static Analysis" |
|||
|
|||
on: |
|||
pull_request: |
|||
branches: |
|||
- "*.x" |
|||
push: |
|||
branches: |
|||
- "*.x" |
|||
|
|||
env: |
|||
COMPOSER_ROOT_VERSION: "1.4" |
|||
|
|||
jobs: |
|||
static-analysis-phpstan: |
|||
name: "Static Analysis with PHPStan" |
|||
runs-on: "ubuntu-20.04" |
|||
|
|||
strategy: |
|||
matrix: |
|||
php-version: |
|||
- "7.4" |
|||
|
|||
steps: |
|||
- name: "Checkout code" |
|||
uses: "actions/checkout@v2" |
|||
|
|||
- name: "Install PHP" |
|||
uses: "shivammathur/setup-php@v2" |
|||
with: |
|||
coverage: "none" |
|||
php-version: "${{ matrix.php-version }}" |
|||
tools: "cs2pr" |
|||
|
|||
- name: "Cache dependencies installed with composer" |
|||
uses: "actions/cache@v2" |
|||
with: |
|||
path: "~/.composer/cache" |
|||
key: "php-${{ matrix.php-version }}-composer-locked-${{ hashFiles('composer.lock') }}" |
|||
restore-keys: "php-${{ matrix.php-version }}-composer-locked-" |
|||
|
|||
- name: "Install dependencies with composer" |
|||
run: "composer install --no-interaction --no-progress" |
|||
|
|||
- name: "Run a static analysis with phpstan/phpstan" |
|||
run: "vendor/bin/phpstan analyse --error-format=checkstyle | cs2pr" |
@ -0,0 +1,35 @@ |
|||
# Contributing |
|||
|
|||
* Follow the [Doctrine Coding Standard](https://github.com/doctrine/coding-standard) |
|||
* The project will follow strict [object calisthenics](http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php) |
|||
* Any contribution must provide tests for additional introduced conditions |
|||
* Any un-confirmed issue needs a failing test case before being accepted |
|||
* Pull requests must be sent from a new hotfix/feature branch, not from `master`. |
|||
|
|||
## Installation |
|||
|
|||
To install the project and run the tests, you need to clone it first: |
|||
|
|||
```sh |
|||
$ git clone git://github.com/doctrine/instantiator.git |
|||
``` |
|||
|
|||
You will then need to run a composer installation: |
|||
|
|||
```sh |
|||
$ cd Instantiator |
|||
$ curl -s https://getcomposer.org/installer | php |
|||
$ php composer.phar update |
|||
``` |
|||
|
|||
## Testing |
|||
|
|||
The PHPUnit version to be used is the one installed as a dev- dependency via composer: |
|||
|
|||
```sh |
|||
$ ./vendor/bin/phpunit |
|||
``` |
|||
|
|||
Accepted coverage for new contributions is 80%. Any contribution not satisfying this requirement |
|||
won't be merged. |
|||
|
@ -0,0 +1,19 @@ |
|||
Copyright (c) 2014 Doctrine Project |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy of |
|||
this software and associated documentation files (the "Software"), to deal in |
|||
the Software without restriction, including without limitation the rights to |
|||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies |
|||
of the Software, and to permit persons to whom the Software is furnished to do |
|||
so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in all |
|||
copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
SOFTWARE. |
@ -0,0 +1,38 @@ |
|||
# Instantiator |
|||
|
|||
This library provides a way of avoiding usage of constructors when instantiating PHP classes. |
|||
|
|||
[![Build Status](https://travis-ci.org/doctrine/instantiator.svg?branch=master)](https://travis-ci.org/doctrine/instantiator) |
|||
[![Code Coverage](https://codecov.io/gh/doctrine/instantiator/branch/master/graph/badge.svg)](https://codecov.io/gh/doctrine/instantiator/branch/master) |
|||
[![Dependency Status](https://www.versioneye.com/package/php--doctrine--instantiator/badge.svg)](https://www.versioneye.com/package/php--doctrine--instantiator) |
|||
|
|||
[![Latest Stable Version](https://poser.pugx.org/doctrine/instantiator/v/stable.png)](https://packagist.org/packages/doctrine/instantiator) |
|||
[![Latest Unstable Version](https://poser.pugx.org/doctrine/instantiator/v/unstable.png)](https://packagist.org/packages/doctrine/instantiator) |
|||
|
|||
## Installation |
|||
|
|||
The suggested installation method is via [composer](https://getcomposer.org/): |
|||
|
|||
```sh |
|||
php composer.phar require "doctrine/instantiator:~1.0.3" |
|||
``` |
|||
|
|||
## Usage |
|||
|
|||
The instantiator is able to create new instances of any class without using the constructor or any API of the class |
|||
itself: |
|||
|
|||
```php |
|||
$instantiator = new \Doctrine\Instantiator\Instantiator(); |
|||
|
|||
$instance = $instantiator->instantiate(\My\ClassName\Here::class); |
|||
``` |
|||
|
|||
## Contributing |
|||
|
|||
Please read the [CONTRIBUTING.md](CONTRIBUTING.md) contents if you wish to help out! |
|||
|
|||
## Credits |
|||
|
|||
This library was migrated from [ocramius/instantiator](https://github.com/Ocramius/Instantiator), which |
|||
has been donated to the doctrine organization, and which is now deprecated in favour of this package. |
@ -0,0 +1,42 @@ |
|||
{ |
|||
"name": "doctrine/instantiator", |
|||
"description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", |
|||
"type": "library", |
|||
"license": "MIT", |
|||
"homepage": "https://www.doctrine-project.org/projects/instantiator.html", |
|||
"keywords": [ |
|||
"instantiate", |
|||
"constructor" |
|||
], |
|||
"authors": [ |
|||
{ |
|||
"name": "Marco Pivetta", |
|||
"email": "[email protected]", |
|||
"homepage": "https://ocramius.github.io/" |
|||
} |
|||
], |
|||
"require": { |
|||
"php": "^7.1 || ^8.0" |
|||
}, |
|||
"require-dev": { |
|||
"ext-phar": "*", |
|||
"ext-pdo": "*", |
|||
"doctrine/coding-standard": "^8.0", |
|||
"phpbench/phpbench": "^0.13 || 1.0.0-alpha2", |
|||
"phpstan/phpstan": "^0.12", |
|||
"phpstan/phpstan-phpunit": "^0.12", |
|||
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" |
|||
}, |
|||
"autoload": { |
|||
"psr-4": { |
|||
"Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" |
|||
} |
|||
}, |
|||
"autoload-dev": { |
|||
"psr-0": { |
|||
"DoctrineTest\\InstantiatorPerformance\\": "tests", |
|||
"DoctrineTest\\InstantiatorTest\\": "tests", |
|||
"DoctrineTest\\InstantiatorTestAsset\\": "tests" |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,68 @@ |
|||
Introduction |
|||
============ |
|||
|
|||
This library provides a way of avoiding usage of constructors when instantiating PHP classes. |
|||
|
|||
Installation |
|||
============ |
|||
|
|||
The suggested installation method is via `composer`_: |
|||
|
|||
.. code-block:: console |
|||
|
|||
$ composer require doctrine/instantiator |
|||
|
|||
Usage |
|||
===== |
|||
|
|||
The instantiator is able to create new instances of any class without |
|||
using the constructor or any API of the class itself: |
|||
|
|||
.. code-block:: php |
|||
|
|||
<?php |
|||
|
|||
use Doctrine\Instantiator\Instantiator; |
|||
use App\Entities\User; |
|||
|
|||
$instantiator = new Instantiator(); |
|||
|
|||
$user = $instantiator->instantiate(User::class); |
|||
|
|||
Contributing |
|||
============ |
|||
|
|||
- Follow the `Doctrine Coding Standard`_ |
|||
- The project will follow strict `object calisthenics`_ |
|||
- Any contribution must provide tests for additional introduced |
|||
conditions |
|||
- Any un-confirmed issue needs a failing test case before being |
|||
accepted |
|||
- Pull requests must be sent from a new hotfix/feature branch, not from |
|||
``master``. |
|||
|
|||
Testing |
|||
======= |
|||
|
|||
The PHPUnit version to be used is the one installed as a dev- dependency |
|||
via composer: |
|||
|
|||
.. code-block:: console |
|||
|
|||
$ ./vendor/bin/phpunit |
|||
|
|||
Accepted coverage for new contributions is 80%. Any contribution not |
|||
satisfying this requirement won’t be merged. |
|||
|
|||
Credits |
|||
======= |
|||
|
|||
This library was migrated from `ocramius/instantiator`_, which has been |
|||
donated to the doctrine organization, and which is now deprecated in |
|||
favour of this package. |
|||
|
|||
.. _composer: https://getcomposer.org/ |
|||
.. _CONTRIBUTING.md: CONTRIBUTING.md |
|||
.. _ocramius/instantiator: https://github.com/Ocramius/Instantiator |
|||
.. _Doctrine Coding Standard: https://github.com/doctrine/coding-standard |
|||
.. _object calisthenics: http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php |
@ -0,0 +1,4 @@ |
|||
.. toctree:: |
|||
:depth: 3 |
|||
|
|||
index |
@ -0,0 +1,4 @@ |
|||
{ |
|||
"bootstrap": "vendor/autoload.php", |
|||
"path": "tests/DoctrineTest/InstantiatorPerformance" |
|||
} |
@ -0,0 +1,50 @@ |
|||
<?xml version="1.0"?> |
|||
<ruleset> |
|||
<arg name="basepath" value="."/> |
|||
<arg name="extensions" value="php"/> |
|||
<arg name="parallel" value="80"/> |
|||
<arg name="cache" value=".phpcs-cache"/> |
|||
<arg name="colors"/> |
|||
|
|||
<!-- Ignore warnings, show progress of the run and show sniff names --> |
|||
<arg value="nps"/> |
|||
|
|||
<file>src</file> |
|||
<file>tests</file> |
|||
|
|||
<rule ref="Doctrine"> |
|||
<exclude name="SlevomatCodingStandard.TypeHints.DeclareStrictTypes"/> |
|||
<exclude name="SlevomatCodingStandard.TypeHints.TypeHintDeclaration.MissingParameterTypeHint"/> |
|||
<exclude name="SlevomatCodingStandard.TypeHints.TypeHintDeclaration.MissingReturnTypeHint"/> |
|||
<exclude name="SlevomatCodingStandard.Exceptions.ReferenceThrowableOnly.ReferencedGeneralException"/> |
|||
</rule> |
|||
|
|||
<!-- Disable the rules that will require PHP 7.4 --> |
|||
<rule ref="SlevomatCodingStandard.TypeHints.PropertyTypeHint"> |
|||
<properties> |
|||
<property name="enableNativeTypeHint" value="false"/> |
|||
</properties> |
|||
</rule> |
|||
|
|||
<rule ref="SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint"> |
|||
<exclude-pattern>*/src/*</exclude-pattern> |
|||
</rule> |
|||
|
|||
<rule ref="SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingNativeTypeHint"> |
|||
<exclude-pattern>*/src/*</exclude-pattern> |
|||
</rule> |
|||
|
|||
<rule ref="SlevomatCodingStandard.Classes.SuperfluousAbstractClassNaming"> |
|||
<exclude-pattern>tests/DoctrineTest/InstantiatorTestAsset/AbstractClassAsset.php</exclude-pattern> |
|||
</rule> |
|||
|
|||
<rule ref="SlevomatCodingStandard.Classes.SuperfluousExceptionNaming"> |
|||
<exclude-pattern>src/Doctrine/Instantiator/Exception/UnexpectedValueException.php</exclude-pattern> |
|||
<exclude-pattern>src/Doctrine/Instantiator/Exception/InvalidArgumentException.php</exclude-pattern> |
|||
</rule> |
|||
|
|||
<rule ref="SlevomatCodingStandard.Classes.SuperfluousInterfaceNaming"> |
|||
<exclude-pattern>src/Doctrine/Instantiator/Exception/ExceptionInterface.php</exclude-pattern> |
|||
<exclude-pattern>src/Doctrine/Instantiator/InstantiatorInterface.php</exclude-pattern> |
|||
</rule> |
|||
</ruleset> |
@ -0,0 +1,15 @@ |
|||
includes: |
|||
- vendor/phpstan/phpstan-phpunit/extension.neon |
|||
- vendor/phpstan/phpstan-phpunit/rules.neon |
|||
|
|||
parameters: |
|||
level: max |
|||
paths: |
|||
- src |
|||
- tests |
|||
|
|||
ignoreErrors: |
|||
# dynamic properties confuse static analysis |
|||
- |
|||
message: '#Access to an undefined property object::\$foo\.#' |
|||
path: '*/tests/DoctrineTest/InstantiatorTest/InstantiatorTest.php' |
@ -0,0 +1,12 @@ |
|||
<?php |
|||
|
|||
namespace Doctrine\Instantiator\Exception; |
|||
|
|||
use Throwable; |
|||
|
|||
/** |
|||
* Base exception marker interface for the instantiator component |
|||
*/ |
|||
interface ExceptionInterface extends Throwable |
|||
{ |
|||
} |
@ -0,0 +1,41 @@ |
|||
<?php |
|||
|
|||
namespace Doctrine\Instantiator\Exception; |
|||
|
|||
use InvalidArgumentException as BaseInvalidArgumentException; |
|||
use ReflectionClass; |
|||
|
|||
use function interface_exists; |
|||
use function sprintf; |
|||
use function trait_exists; |
|||
|
|||
/** |
|||
* Exception for invalid arguments provided to the instantiator |
|||
*/ |
|||
class InvalidArgumentException extends BaseInvalidArgumentException implements ExceptionInterface |
|||
{ |
|||
public static function fromNonExistingClass(string $className): self |
|||
{ |
|||
if (interface_exists($className)) { |
|||
return new self(sprintf('The provided type "%s" is an interface, and can not be instantiated', $className)); |
|||
} |
|||
|
|||
if (trait_exists($className)) { |
|||
return new self(sprintf('The provided type "%s" is a trait, and can not be instantiated', $className)); |
|||
} |
|||
|
|||
return new self(sprintf('The provided class "%s" does not exist', $className)); |
|||
} |
|||
|
|||
/** |
|||
* @template T of object |
|||
* @phpstan-param ReflectionClass<T> $reflectionClass |
|||
*/ |
|||
public static function fromAbstractClass(ReflectionClass $reflectionClass): self |
|||
{ |
|||
return new self(sprintf( |
|||
'The provided class "%s" is abstract, and can not be instantiated', |
|||
$reflectionClass->getName() |
|||
)); |
|||
} |
|||
} |
@ -0,0 +1,57 @@ |
|||
<?php |
|||
|
|||
namespace Doctrine\Instantiator\Exception; |
|||
|
|||
use Exception; |
|||
use ReflectionClass; |
|||
use UnexpectedValueException as BaseUnexpectedValueException; |
|||
|
|||
use function sprintf; |
|||
|
|||
/** |
|||
* Exception for given parameters causing invalid/unexpected state on instantiation |
|||
*/ |
|||
class UnexpectedValueException extends BaseUnexpectedValueException implements ExceptionInterface |
|||
{ |
|||
/** |
|||
* @template T of object |
|||
* @phpstan-param ReflectionClass<T> $reflectionClass |
|||
*/ |
|||
public static function fromSerializationTriggeredException( |
|||
ReflectionClass $reflectionClass, |
|||
Exception $exception |
|||
): self { |
|||
return new self( |
|||
sprintf( |
|||
'An exception was raised while trying to instantiate an instance of "%s" via un-serialization', |
|||
$reflectionClass->getName() |
|||
), |
|||
0, |
|||
$exception |
|||
); |
|||
} |
|||
|
|||
/** |
|||
* @template T of object |
|||
* @phpstan-param ReflectionClass<T> $reflectionClass |
|||
*/ |
|||
public static function fromUncleanUnSerialization( |
|||
ReflectionClass $reflectionClass, |
|||
string $errorString, |
|||
int $errorCode, |
|||
string $errorFile, |
|||
int $errorLine |
|||
): self { |
|||
return new self( |
|||
sprintf( |
|||
'Could not produce an instance of "%s" via un-serialization, since an error was triggered ' |
|||
. 'in file "%s" at line "%d"', |
|||
$reflectionClass->getName(), |
|||
$errorFile, |
|||
$errorLine |
|||
), |
|||
0, |
|||
new Exception($errorString, $errorCode) |
|||
); |
|||
} |
|||
} |
@ -0,0 +1,232 @@ |
|||
<?php |
|||
|
|||
namespace Doctrine\Instantiator; |
|||
|
|||
use ArrayIterator; |
|||
use Doctrine\Instantiator\Exception\InvalidArgumentException; |
|||
use Doctrine\Instantiator\Exception\UnexpectedValueException; |
|||
use Exception; |
|||
use ReflectionClass; |
|||
use ReflectionException; |
|||
use Serializable; |
|||
|
|||
use function class_exists; |
|||
use function is_subclass_of; |
|||
use function restore_error_handler; |
|||
use function set_error_handler; |
|||
use function sprintf; |
|||
use function strlen; |
|||
use function unserialize; |
|||
|
|||
final class Instantiator implements InstantiatorInterface |
|||
{ |
|||
/** |
|||
* Markers used internally by PHP to define whether {@see \unserialize} should invoke |
|||
* the method {@see \Serializable::unserialize()} when dealing with classes implementing |
|||
* the {@see \Serializable} interface. |
|||
*/ |
|||
public const SERIALIZATION_FORMAT_USE_UNSERIALIZER = 'C'; |
|||
public const SERIALIZATION_FORMAT_AVOID_UNSERIALIZER = 'O'; |
|||
|
|||
/** |
|||
* Used to instantiate specific classes, indexed by class name. |
|||
* |
|||
* @var callable[] |
|||
*/ |
|||
private static $cachedInstantiators = []; |
|||
|
|||
/** |
|||
* Array of objects that can directly be cloned, indexed by class name. |
|||
* |
|||
* @var object[] |
|||
*/ |
|||
private static $cachedCloneables = []; |
|||
|
|||
/** |
|||
* {@inheritDoc} |
|||
*/ |
|||
public function instantiate($className) |
|||
{ |
|||
if (isset(self::$cachedCloneables[$className])) { |
|||
return clone self::$cachedCloneables[$className]; |
|||
} |
|||
|
|||
if (isset(self::$cachedInstantiators[$className])) { |
|||
$factory = self::$cachedInstantiators[$className]; |
|||
|
|||
return $factory(); |
|||
} |
|||
|
|||
return $this->buildAndCacheFromFactory($className); |
|||
} |
|||
|
|||
/** |
|||
* Builds the requested object and caches it in static properties for performance |
|||
* |
|||
* @return object |
|||
* |
|||
* @template T of object |
|||
* @phpstan-param class-string<T> $className |
|||
* |
|||
* @phpstan-return T |
|||
*/ |
|||
private function buildAndCacheFromFactory(string $className) |
|||
{ |
|||
$factory = self::$cachedInstantiators[$className] = $this->buildFactory($className); |
|||
$instance = $factory(); |
|||
|
|||
if ($this->isSafeToClone(new ReflectionClass($instance))) { |
|||
self::$cachedCloneables[$className] = clone $instance; |
|||
} |
|||
|
|||
return $instance; |
|||
} |
|||
|
|||
/** |
|||
* Builds a callable capable of instantiating the given $className without |
|||
* invoking its constructor. |
|||
* |
|||
* @throws InvalidArgumentException |
|||
* @throws UnexpectedValueException |
|||
* @throws ReflectionException |
|||
* |
|||
* @template T of object |
|||
* @phpstan-param class-string<T> $className |
|||
* |
|||
* @phpstan-return callable(): T |
|||
*/ |
|||
private function buildFactory(string $className): callable |
|||
{ |
|||
$reflectionClass = $this->getReflectionClass($className); |
|||
|
|||
if ($this->isInstantiableViaReflection($reflectionClass)) { |
|||
return [$reflectionClass, 'newInstanceWithoutConstructor']; |
|||
} |
|||
|
|||
$serializedString = sprintf( |
|||
'%s:%d:"%s":0:{}', |
|||
is_subclass_of($className, Serializable::class) ? self::SERIALIZATION_FORMAT_USE_UNSERIALIZER : self::SERIALIZATION_FORMAT_AVOID_UNSERIALIZER, |
|||
strlen($className), |
|||
$className |
|||
); |
|||
|
|||
$this->checkIfUnSerializationIsSupported($reflectionClass, $serializedString); |
|||
|
|||
return static function () use ($serializedString) { |
|||
return unserialize($serializedString); |
|||
}; |
|||
} |
|||
|
|||
/** |
|||
* @throws InvalidArgumentException |
|||
* @throws ReflectionException |
|||
* |
|||
* @template T of object |
|||
* @phpstan-param class-string<T> $className |
|||
* |
|||
* @phpstan-return ReflectionClass<T> |
|||
*/ |
|||
private function getReflectionClass(string $className): ReflectionClass |
|||
{ |
|||
if (! class_exists($className)) { |
|||
throw InvalidArgumentException::fromNonExistingClass($className); |
|||
} |
|||
|
|||
$reflection = new ReflectionClass($className); |
|||
|
|||
if ($reflection->isAbstract()) { |
|||
throw InvalidArgumentException::fromAbstractClass($reflection); |
|||
} |
|||
|
|||
return $reflection; |
|||
} |
|||
|
|||
/** |
|||
* @throws UnexpectedValueException |
|||
* |
|||
* @template T of object |
|||
* @phpstan-param ReflectionClass<T> $reflectionClass |
|||
*/ |
|||
private function checkIfUnSerializationIsSupported(ReflectionClass $reflectionClass, string $serializedString): void |
|||
{ |
|||
set_error_handler(static function (int $code, string $message, string $file, int $line) use ($reflectionClass, &$error): bool { |
|||
$error = UnexpectedValueException::fromUncleanUnSerialization( |
|||
$reflectionClass, |
|||
$message, |
|||
$code, |
|||
$file, |
|||
$line |
|||
); |
|||
|
|||
return true; |
|||
}); |
|||
|
|||
try { |
|||
$this->attemptInstantiationViaUnSerialization($reflectionClass, $serializedString); |
|||
} finally { |
|||
restore_error_handler(); |
|||
} |
|||
|
|||
if ($error) { |
|||
throw $error; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* @throws UnexpectedValueException |
|||
* |
|||
* @template T of object |
|||
* @phpstan-param ReflectionClass<T> $reflectionClass |
|||
*/ |
|||
private function attemptInstantiationViaUnSerialization(ReflectionClass $reflectionClass, string $serializedString): void |
|||
{ |
|||
try { |
|||
unserialize($serializedString); |
|||
} catch (Exception $exception) { |
|||
throw UnexpectedValueException::fromSerializationTriggeredException($reflectionClass, $exception); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* @template T of object |
|||
* @phpstan-param ReflectionClass<T> $reflectionClass |
|||
*/ |
|||
private function isInstantiableViaReflection(ReflectionClass $reflectionClass): bool |
|||
{ |
|||
return ! ($this->hasInternalAncestors($reflectionClass) && $reflectionClass->isFinal()); |
|||
} |
|||
|
|||
/** |
|||
* Verifies whether the given class is to be considered internal |
|||
* |
|||
* @template T of object |
|||
* @phpstan-param ReflectionClass<T> $reflectionClass |
|||
*/ |
|||
private function hasInternalAncestors(ReflectionClass $reflectionClass): bool |
|||
{ |
|||
do { |
|||
if ($reflectionClass->isInternal()) { |
|||
return true; |
|||
} |
|||
|
|||
$reflectionClass = $reflectionClass->getParentClass(); |
|||
} while ($reflectionClass); |
|||
|
|||
return false; |
|||
} |
|||
|
|||
/** |
|||
* Checks if a class is cloneable |
|||
* |
|||
* Classes implementing `__clone` cannot be safely cloned, as that may cause side-effects. |
|||
* |
|||
* @template T of object |
|||
* @phpstan-param ReflectionClass<T> $reflectionClass |
|||
*/ |
|||
private function isSafeToClone(ReflectionClass $reflectionClass): bool |
|||
{ |
|||
return $reflectionClass->isCloneable() |
|||
&& ! $reflectionClass->hasMethod('__clone') |
|||
&& ! $reflectionClass->isSubclassOf(ArrayIterator::class); |
|||
} |
|||
} |
@ -0,0 +1,23 @@ |
|||
<?php |
|||
|
|||
namespace Doctrine\Instantiator; |
|||
|
|||
use Doctrine\Instantiator\Exception\ExceptionInterface; |
|||
|
|||
/** |
|||
* Instantiator provides utility methods to build objects without invoking their constructors |
|||
*/ |
|||
interface InstantiatorInterface |
|||
{ |
|||
/** |
|||
* @param string $className |
|||
* |
|||
* @return object |
|||
* |
|||
* @throws ExceptionInterface |
|||
* |
|||
* @template T of object |
|||
* @phpstan-param class-string<T> $className |
|||
*/ |
|||
public function instantiate($className); |
|||
} |
@ -0,0 +1,12 @@ |
|||
# These are supported funding model platforms |
|||
|
|||
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] |
|||
patreon: # Replace with a single Patreon username |
|||
open_collective: # Replace with a single Open Collective username |
|||
ko_fi: # Replace with a single Ko-fi username |
|||
tidelift: "packagist/myclabs/deep-copy" |
|||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry |
|||
liberapay: # Replace with a single Liberapay username |
|||
issuehunt: # Replace with a single IssueHunt username |
|||
otechie: # Replace with a single Otechie username |
|||
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] |
@ -0,0 +1,20 @@ |
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2013 My C-Sense |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy of |
|||
this software and associated documentation files (the "Software"), to deal in |
|||
the Software without restriction, including without limitation the rights to |
|||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of |
|||
the Software, and to permit persons to whom the Software is furnished to do so, |
|||
subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in all |
|||
copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS |
|||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR |
|||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER |
|||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
|||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
@ -0,0 +1,375 @@ |
|||
# DeepCopy |
|||
|
|||
DeepCopy helps you create deep copies (clones) of your objects. It is designed to handle cycles in the association graph. |
|||
|
|||
[![Build Status](https://travis-ci.org/myclabs/DeepCopy.png?branch=1.x)](https://travis-ci.org/myclabs/DeepCopy) |
|||
[![Coverage Status](https://coveralls.io/repos/myclabs/DeepCopy/badge.png?branch=1.x)](https://coveralls.io/r/myclabs/DeepCopy?branch=1.x) |
|||
[![Scrutinizer Quality Score](https://scrutinizer-ci.com/g/myclabs/DeepCopy/badges/quality-score.png?s=2747100c19b275f93a777e3297c6c12d1b68b934)](https://scrutinizer-ci.com/g/myclabs/DeepCopy/) |
|||
[![Total Downloads](https://poser.pugx.org/myclabs/deep-copy/downloads.svg)](https://packagist.org/packages/myclabs/deep-copy) |
|||
|
|||
## Table of Contents |
|||
|
|||
1. [How](#how) |
|||
1. [Why](#why) |
|||
1. [Using simply `clone`](#using-simply-clone) |
|||
1. [Overridding `__clone()`](#overridding-__clone) |
|||
1. [With `DeepCopy`](#with-deepcopy) |
|||
1. [How it works](#how-it-works) |
|||
1. [Going further](#going-further) |
|||
1. [Matchers](#matchers) |
|||
1. [Property name](#property-name) |
|||
1. [Specific property](#specific-property) |
|||
1. [Type](#type) |
|||
1. [Filters](#filters) |
|||
1. [`SetNullFilter`](#setnullfilter-filter) |
|||
1. [`KeepFilter`](#keepfilter-filter) |
|||
1. [`DoctrineCollectionFilter`](#doctrinecollectionfilter-filter) |
|||
1. [`DoctrineEmptyCollectionFilter`](#doctrineemptycollectionfilter-filter) |
|||
1. [`DoctrineProxyFilter`](#doctrineproxyfilter-filter) |
|||
1. [`ReplaceFilter`](#replacefilter-type-filter) |
|||
1. [`ShallowCopyFilter`](#shallowcopyfilter-type-filter) |
|||
1. [Edge cases](#edge-cases) |
|||
1. [Contributing](#contributing) |
|||
1. [Tests](#tests) |
|||
|
|||
|
|||
## How? |
|||
|
|||
Install with Composer: |
|||
|
|||
```json |
|||
composer require myclabs/deep-copy |
|||
``` |
|||
|
|||
Use simply: |
|||
|
|||
```php |
|||
use DeepCopy\DeepCopy; |
|||
|
|||
$copier = new DeepCopy(); |
|||
$myCopy = $copier->copy($myObject); |
|||
``` |
|||
|
|||
|
|||
## Why? |
|||
|
|||
- How do you create copies of your objects? |
|||
|
|||
```php |
|||
$myCopy = clone $myObject; |
|||
``` |
|||
|
|||
- How do you create **deep** copies of your objects (i.e. copying also all the objects referenced in the properties)? |
|||
|
|||
You use [`__clone()`](http://www.php.net/manual/en/language.oop5.cloning.php#object.clone) and implement the behavior |
|||
yourself. |
|||
|
|||
- But how do you handle **cycles** in the association graph? |
|||
|
|||
Now you're in for a big mess :( |
|||
|
|||
![association graph](doc/graph.png) |
|||
|
|||
|
|||
### Using simply `clone` |
|||
|
|||
![Using clone](doc/clone.png) |
|||
|
|||
|
|||
### Overridding `__clone()` |
|||
|
|||
![Overridding __clone](doc/deep-clone.png) |
|||
|
|||
|
|||
### With `DeepCopy` |
|||
|
|||
![With DeepCopy](doc/deep-copy.png) |
|||
|
|||
|
|||
## How it works |
|||
|
|||
DeepCopy recursively traverses all the object's properties and clones them. To avoid cloning the same object twice it |
|||
keeps a hash map of all instances and thus preserves the object graph. |
|||
|
|||
To use it: |
|||
|
|||
```php |
|||
use function DeepCopy\deep_copy; |
|||
|
|||
$copy = deep_copy($var); |
|||
``` |
|||
|
|||
Alternatively, you can create your own `DeepCopy` instance to configure it differently for example: |
|||
|
|||
```php |
|||
use DeepCopy\DeepCopy; |
|||
|
|||
$copier = new DeepCopy(true); |
|||
|
|||
$copy = $copier->copy($var); |
|||
``` |
|||
|
|||
You may want to roll your own deep copy function: |
|||
|
|||
```php |
|||
namespace Acme; |
|||
|
|||
use DeepCopy\DeepCopy; |
|||
|
|||
function deep_copy($var) |
|||
{ |
|||
static $copier = null; |
|||
|
|||
if (null === $copier) { |
|||
$copier = new DeepCopy(true); |
|||
} |
|||
|
|||
return $copier->copy($var); |
|||
} |
|||
``` |
|||
|
|||
|
|||
## Going further |
|||
|
|||
You can add filters to customize the copy process. |
|||
|
|||
The method to add a filter is `DeepCopy\DeepCopy::addFilter($filter, $matcher)`, |
|||
with `$filter` implementing `DeepCopy\Filter\Filter` |
|||
and `$matcher` implementing `DeepCopy\Matcher\Matcher`. |
|||
|
|||
We provide some generic filters and matchers. |
|||
|
|||
|
|||
### Matchers |
|||
|
|||
- `DeepCopy\Matcher` applies on a object attribute. |
|||
- `DeepCopy\TypeMatcher` applies on any element found in graph, including array elements. |
|||
|
|||
|
|||
#### Property name |
|||
|
|||
The `PropertyNameMatcher` will match a property by its name: |
|||
|
|||
```php |
|||
use DeepCopy\Matcher\PropertyNameMatcher; |
|||
|
|||
// Will apply a filter to any property of any objects named "id" |
|||
$matcher = new PropertyNameMatcher('id'); |
|||
``` |
|||
|
|||
|
|||
#### Specific property |
|||
|
|||
The `PropertyMatcher` will match a specific property of a specific class: |
|||
|
|||
```php |
|||
use DeepCopy\Matcher\PropertyMatcher; |
|||
|
|||
// Will apply a filter to the property "id" of any objects of the class "MyClass" |
|||
$matcher = new PropertyMatcher('MyClass', 'id'); |
|||
``` |
|||
|
|||
|
|||
#### Type |
|||
|
|||
The `TypeMatcher` will match any element by its type (instance of a class or any value that could be parameter of |
|||
[gettype()](http://php.net/manual/en/function.gettype.php) function): |
|||
|
|||
```php |
|||
use DeepCopy\TypeMatcher\TypeMatcher; |
|||
|
|||
// Will apply a filter to any object that is an instance of Doctrine\Common\Collections\Collection |
|||
$matcher = new TypeMatcher('Doctrine\Common\Collections\Collection'); |
|||
``` |
|||
|
|||
|
|||
### Filters |
|||
|
|||
- `DeepCopy\Filter` applies a transformation to the object attribute matched by `DeepCopy\Matcher` |
|||
- `DeepCopy\TypeFilter` applies a transformation to any element matched by `DeepCopy\TypeMatcher` |
|||
|
|||
|
|||
#### `SetNullFilter` (filter) |
|||
|
|||
Let's say for example that you are copying a database record (or a Doctrine entity), so you want the copy not to have |
|||
any ID: |
|||
|
|||
```php |
|||
use DeepCopy\DeepCopy; |
|||
use DeepCopy\Filter\SetNullFilter; |
|||
use DeepCopy\Matcher\PropertyNameMatcher; |
|||
|
|||
$object = MyClass::load(123); |
|||
echo $object->id; // 123 |
|||
|
|||
$copier = new DeepCopy(); |
|||
$copier->addFilter(new SetNullFilter(), new PropertyNameMatcher('id')); |
|||
|
|||
$copy = $copier->copy($object); |
|||
|
|||
echo $copy->id; // null |
|||
``` |
|||
|
|||
|
|||
#### `KeepFilter` (filter) |
|||
|
|||
If you want a property to remain untouched (for example, an association to an object): |
|||
|
|||
```php |
|||
use DeepCopy\DeepCopy; |
|||
use DeepCopy\Filter\KeepFilter; |
|||
use DeepCopy\Matcher\PropertyMatcher; |
|||
|
|||
$copier = new DeepCopy(); |
|||
$copier->addFilter(new KeepFilter(), new PropertyMatcher('MyClass', 'category')); |
|||
|
|||
$copy = $copier->copy($object); |
|||
// $copy->category has not been touched |
|||
``` |
|||
|
|||
|
|||
#### `DoctrineCollectionFilter` (filter) |
|||
|
|||
If you use Doctrine and want to copy an entity, you will need to use the `DoctrineCollectionFilter`: |
|||
|
|||
```php |
|||
use DeepCopy\DeepCopy; |
|||
use DeepCopy\Filter\Doctrine\DoctrineCollectionFilter; |
|||
use DeepCopy\Matcher\PropertyTypeMatcher; |
|||
|
|||
$copier = new DeepCopy(); |
|||
$copier->addFilter(new DoctrineCollectionFilter(), new PropertyTypeMatcher('Doctrine\Common\Collections\Collection')); |
|||
|
|||
$copy = $copier->copy($object); |
|||
``` |
|||
|
|||
|
|||
#### `DoctrineEmptyCollectionFilter` (filter) |
|||
|
|||
If you use Doctrine and want to copy an entity who contains a `Collection` that you want to be reset, you can use the |
|||
`DoctrineEmptyCollectionFilter` |
|||
|
|||
```php |
|||
use DeepCopy\DeepCopy; |
|||
use DeepCopy\Filter\Doctrine\DoctrineEmptyCollectionFilter; |
|||
use DeepCopy\Matcher\PropertyMatcher; |
|||
|
|||
$copier = new DeepCopy(); |
|||
$copier->addFilter(new DoctrineEmptyCollectionFilter(), new PropertyMatcher('MyClass', 'myProperty')); |
|||
|
|||
$copy = $copier->copy($object); |
|||
|
|||
// $copy->myProperty will return an empty collection |
|||
``` |
|||
|
|||
|
|||
#### `DoctrineProxyFilter` (filter) |
|||
|
|||
If you use Doctrine and use cloning on lazy loaded entities, you might encounter errors mentioning missing fields on a |
|||
Doctrine proxy class (...\\\_\_CG\_\_\Proxy). |
|||
You can use the `DoctrineProxyFilter` to load the actual entity behind the Doctrine proxy class. |
|||
**Make sure, though, to put this as one of your very first filters in the filter chain so that the entity is loaded |
|||
before other filters are applied!** |
|||
|
|||
```php |
|||
use DeepCopy\DeepCopy; |
|||
use DeepCopy\Filter\Doctrine\DoctrineProxyFilter; |
|||
use DeepCopy\Matcher\Doctrine\DoctrineProxyMatcher; |
|||
|
|||
$copier = new DeepCopy(); |
|||
$copier->addFilter(new DoctrineProxyFilter(), new DoctrineProxyMatcher()); |
|||
|
|||
$copy = $copier->copy($object); |
|||
|
|||
// $copy should now contain a clone of all entities, including those that were not yet fully loaded. |
|||
``` |
|||
|
|||
|
|||
#### `ReplaceFilter` (type filter) |
|||
|
|||
1. If you want to replace the value of a property: |
|||
|
|||
```php |
|||
use DeepCopy\DeepCopy; |
|||
use DeepCopy\Filter\ReplaceFilter; |
|||
use DeepCopy\Matcher\PropertyMatcher; |
|||
|
|||
$copier = new DeepCopy(); |
|||
$callback = function ($currentValue) { |
|||
return $currentValue . ' (copy)' |
|||
}; |
|||
$copier->addFilter(new ReplaceFilter($callback), new PropertyMatcher('MyClass', 'title')); |
|||
|
|||
$copy = $copier->copy($object); |
|||
|
|||
// $copy->title will contain the data returned by the callback, e.g. 'The title (copy)' |
|||
``` |
|||
|
|||
2. If you want to replace whole element: |
|||
|
|||
```php |
|||
use DeepCopy\DeepCopy; |
|||
use DeepCopy\TypeFilter\ReplaceFilter; |
|||
use DeepCopy\TypeMatcher\TypeMatcher; |
|||
|
|||
$copier = new DeepCopy(); |
|||
$callback = function (MyClass $myClass) { |
|||
return get_class($myClass); |
|||
}; |
|||
$copier->addTypeFilter(new ReplaceFilter($callback), new TypeMatcher('MyClass')); |
|||
|
|||
$copy = $copier->copy([new MyClass, 'some string', new MyClass]); |
|||
|
|||
// $copy will contain ['MyClass', 'some string', 'MyClass'] |
|||
``` |
|||
|
|||
|
|||
The `$callback` parameter of the `ReplaceFilter` constructor accepts any PHP callable. |
|||
|
|||
|
|||
#### `ShallowCopyFilter` (type filter) |
|||
|
|||
Stop *DeepCopy* from recursively copying element, using standard `clone` instead: |
|||
|
|||
```php |
|||
use DeepCopy\DeepCopy; |
|||
use DeepCopy\TypeFilter\ShallowCopyFilter; |
|||
use DeepCopy\TypeMatcher\TypeMatcher; |
|||
use Mockery as m; |
|||
|
|||
$this->deepCopy = new DeepCopy(); |
|||
$this->deepCopy->addTypeFilter( |
|||
new ShallowCopyFilter, |
|||
new TypeMatcher(m\MockInterface::class) |
|||
); |
|||
|
|||
$myServiceWithMocks = new MyService(m::mock(MyDependency1::class), m::mock(MyDependency2::class)); |
|||
// All mocks will be just cloned, not deep copied |
|||
``` |
|||
|
|||
|
|||
## Edge cases |
|||
|
|||
The following structures cannot be deep-copied with PHP Reflection. As a result they are shallow cloned and filters are |
|||
not applied. There is two ways for you to handle them: |
|||
|
|||
- Implement your own `__clone()` method |
|||
- Use a filter with a type matcher |
|||
|
|||
|
|||
## Contributing |
|||
|
|||
DeepCopy is distributed under the MIT license. |
|||
|
|||
|
|||
### Tests |
|||
|
|||
Running the tests is simple: |
|||
|
|||
```php |
|||
vendor/bin/phpunit |
|||
``` |
|||
|
|||
### Support |
|||
|
|||
Get professional support via [the Tidelift Subscription](https://tidelift.com/subscription/pkg/packagist-myclabs-deep-copy?utm_source=packagist-myclabs-deep-copy&utm_medium=referral&utm_campaign=readme). |
@ -0,0 +1,38 @@ |
|||
{ |
|||
"name": "myclabs/deep-copy", |
|||
"type": "library", |
|||
"description": "Create deep copies (clones) of your objects", |
|||
"keywords": ["clone", "copy", "duplicate", "object", "object graph"], |
|||
"license": "MIT", |
|||
|
|||
"autoload": { |
|||
"psr-4": { |
|||
"DeepCopy\\": "src/DeepCopy/" |
|||
}, |
|||
"files": [ |
|||
"src/DeepCopy/deep_copy.php" |
|||
] |
|||
}, |
|||
"autoload-dev": { |
|||
"psr-4": { |
|||
"DeepCopy\\": "fixtures/", |
|||
"DeepCopyTest\\": "tests/DeepCopyTest/" |
|||
} |
|||
}, |
|||
|
|||
"require": { |
|||
"php": "^7.1 || ^8.0" |
|||
}, |
|||
"require-dev": { |
|||
"doctrine/collections": "^1.0", |
|||
"doctrine/common": "^2.6", |
|||
"phpunit/phpunit": "^7.1" |
|||
}, |
|||
"replace": { |
|||
"myclabs/deep-copy": "self.version" |
|||
}, |
|||
|
|||
"config": { |
|||
"sort-packages": true |
|||
} |
|||
} |
@ -0,0 +1,298 @@ |
|||
<?php |
|||
|
|||
namespace DeepCopy; |
|||
|
|||
use ArrayObject; |
|||
use DateInterval; |
|||
use DateTimeInterface; |
|||
use DateTimeZone; |
|||
use DeepCopy\Exception\CloneException; |
|||
use DeepCopy\Filter\Filter; |
|||
use DeepCopy\Matcher\Matcher; |
|||
use DeepCopy\Reflection\ReflectionHelper; |
|||
use DeepCopy\TypeFilter\Date\DateIntervalFilter; |
|||
use DeepCopy\TypeFilter\Spl\ArrayObjectFilter; |
|||
use DeepCopy\TypeFilter\Spl\SplDoublyLinkedListFilter; |
|||
use DeepCopy\TypeFilter\TypeFilter; |
|||
use DeepCopy\TypeMatcher\TypeMatcher; |
|||
use ReflectionObject; |
|||
use ReflectionProperty; |
|||
use SplDoublyLinkedList; |
|||
|
|||
/** |
|||
* @final |
|||
*/ |
|||
class DeepCopy |
|||
{ |
|||
/** |
|||
* @var object[] List of objects copied. |
|||
*/ |
|||
private $hashMap = []; |
|||
|
|||
/** |
|||
* Filters to apply. |
|||
* |
|||
* @var array Array of ['filter' => Filter, 'matcher' => Matcher] pairs. |
|||
*/ |
|||
private $filters = []; |
|||
|
|||
/** |
|||
* Type Filters to apply. |
|||
* |
|||
* @var array Array of ['filter' => Filter, 'matcher' => Matcher] pairs. |
|||
*/ |
|||
private $typeFilters = []; |
|||
|
|||
/** |
|||
* @var bool |
|||
*/ |
|||
private $skipUncloneable = false; |
|||
|
|||
/** |
|||
* @var bool |
|||
*/ |
|||
private $useCloneMethod; |
|||
|
|||
/** |
|||
* @param bool $useCloneMethod If set to true, when an object implements the __clone() function, it will be used |
|||
* instead of the regular deep cloning. |
|||
*/ |
|||
public function __construct($useCloneMethod = false) |
|||
{ |
|||
$this->useCloneMethod = $useCloneMethod; |
|||
|
|||
$this->addTypeFilter(new ArrayObjectFilter($this), new TypeMatcher(ArrayObject::class)); |
|||
$this->addTypeFilter(new DateIntervalFilter(), new TypeMatcher(DateInterval::class)); |
|||
$this->addTypeFilter(new SplDoublyLinkedListFilter($this), new TypeMatcher(SplDoublyLinkedList::class)); |
|||
} |
|||
|
|||
/** |
|||
* If enabled, will not throw an exception when coming across an uncloneable property. |
|||
* |
|||
* @param $skipUncloneable |
|||
* |
|||
* @return $this |
|||
*/ |
|||
public function skipUncloneable($skipUncloneable = true) |
|||
{ |
|||
$this->skipUncloneable = $skipUncloneable; |
|||
|
|||
return $this; |
|||
} |
|||
|
|||
/** |
|||
* Deep copies the given object. |
|||
* |
|||
* @param mixed $object |
|||
* |
|||
* @return mixed |
|||
*/ |
|||
public function copy($object) |
|||
{ |
|||
$this->hashMap = []; |
|||
|
|||
return $this->recursiveCopy($object); |
|||
} |
|||
|
|||
public function addFilter(Filter $filter, Matcher $matcher) |
|||
{ |
|||
$this->filters[] = [ |
|||
'matcher' => $matcher, |
|||
'filter' => $filter, |
|||
]; |
|||
} |
|||
|
|||
public function prependFilter(Filter $filter, Matcher $matcher) |
|||
{ |
|||
array_unshift($this->filters, [ |
|||
'matcher' => $matcher, |
|||
'filter' => $filter, |
|||
]); |
|||
} |
|||
|
|||
public function addTypeFilter(TypeFilter $filter, TypeMatcher $matcher) |
|||
{ |
|||
$this->typeFilters[] = [ |
|||
'matcher' => $matcher, |
|||
'filter' => $filter, |
|||
]; |
|||
} |
|||
|
|||
private function recursiveCopy($var) |
|||
{ |
|||
// Matches Type Filter |
|||
if ($filter = $this->getFirstMatchedTypeFilter($this->typeFilters, $var)) { |
|||
return $filter->apply($var); |
|||
} |
|||
|
|||
// Resource |
|||
if (is_resource($var)) { |
|||
return $var; |
|||
} |
|||
|
|||
// Array |
|||
if (is_array($var)) { |
|||
return $this->copyArray($var); |
|||
} |
|||
|
|||
// Scalar |
|||
if (! is_object($var)) { |
|||
return $var; |
|||
} |
|||
|
|||
// Object |
|||
return $this->copyObject($var); |
|||
} |
|||
|
|||
/** |
|||
* Copy an array |
|||
* @param array $array |
|||
* @return array |
|||
*/ |
|||
private function copyArray(array $array) |
|||
{ |
|||
foreach ($array as $key => $value) { |
|||
$array[$key] = $this->recursiveCopy($value); |
|||
} |
|||
|
|||
return $array; |
|||
} |
|||
|
|||
/** |
|||
* Copies an object. |
|||
* |
|||
* @param object $object |
|||
* |
|||
* @throws CloneException |
|||
* |
|||
* @return object |
|||
*/ |
|||
private function copyObject($object) |
|||
{ |
|||
$objectHash = spl_object_hash($object); |
|||
|
|||
if (isset($this->hashMap[$objectHash])) { |
|||
return $this->hashMap[$objectHash]; |
|||
} |
|||
|
|||
$reflectedObject = new ReflectionObject($object); |
|||
$isCloneable = $reflectedObject->isCloneable(); |
|||
|
|||
if (false === $isCloneable) { |
|||
if ($this->skipUncloneable) { |
|||
$this->hashMap[$objectHash] = $object; |
|||
|
|||
return $object; |
|||
} |
|||
|
|||
throw new CloneException( |
|||
sprintf( |
|||
'The class "%s" is not cloneable.', |
|||
$reflectedObject->getName() |
|||
) |
|||
); |
|||
} |
|||
|
|||
$newObject = clone $object; |
|||
$this->hashMap[$objectHash] = $newObject; |
|||
|
|||
if ($this->useCloneMethod && $reflectedObject->hasMethod('__clone')) { |
|||
return $newObject; |
|||
} |
|||
|
|||
if ($newObject instanceof DateTimeInterface || $newObject instanceof DateTimeZone) { |
|||
return $newObject; |
|||
} |
|||
|
|||
foreach (ReflectionHelper::getProperties($reflectedObject) as $property) { |
|||
$this->copyObjectProperty($newObject, $property); |
|||
} |
|||
|
|||
return $newObject; |
|||
} |
|||
|
|||
private function copyObjectProperty($object, ReflectionProperty $property) |
|||
{ |
|||
// Ignore static properties |
|||
if ($property->isStatic()) { |
|||
return; |
|||
} |
|||
|
|||
// Apply the filters |
|||
foreach ($this->filters as $item) { |
|||
/** @var Matcher $matcher */ |
|||
$matcher = $item['matcher']; |
|||
/** @var Filter $filter */ |
|||
$filter = $item['filter']; |
|||
|
|||
if ($matcher->matches($object, $property->getName())) { |
|||
$filter->apply( |
|||
$object, |
|||
$property->getName(), |
|||
function ($object) { |
|||
return $this->recursiveCopy($object); |
|||
} |
|||
); |
|||
|
|||
// If a filter matches, we stop processing this property |
|||
return; |
|||
} |
|||
} |
|||
|
|||
$property->setAccessible(true); |
|||
|
|||
// Ignore uninitialized properties (for PHP >7.4) |
|||
if (method_exists($property, 'isInitialized') && !$property->isInitialized($object)) { |
|||
return; |
|||
} |
|||
|
|||
$propertyValue = $property->getValue($object); |
|||
|
|||
// Copy the property |
|||
$property->setValue($object, $this->recursiveCopy($propertyValue)); |
|||
} |
|||
|
|||
/** |
|||
* Returns first filter that matches variable, `null` if no such filter found. |
|||
* |
|||
* @param array $filterRecords Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and |
|||
* 'matcher' with value of type {@see TypeMatcher} |
|||
* @param mixed $var |
|||
* |
|||
* @return TypeFilter|null |
|||
*/ |
|||
private function getFirstMatchedTypeFilter(array $filterRecords, $var) |
|||
{ |
|||
$matched = $this->first( |
|||
$filterRecords, |
|||
function (array $record) use ($var) { |
|||
/* @var TypeMatcher $matcher */ |
|||
$matcher = $record['matcher']; |
|||
|
|||
return $matcher->matches($var); |
|||
} |
|||
); |
|||
|
|||
return isset($matched) ? $matched['filter'] : null; |
|||
} |
|||
|
|||
/** |
|||
* Returns first element that matches predicate, `null` if no such element found. |
|||
* |
|||
* @param array $elements Array of ['filter' => Filter, 'matcher' => Matcher] pairs. |
|||
* @param callable $predicate Predicate arguments are: element. |
|||
* |
|||
* @return array|null Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and 'matcher' |
|||
* with value of type {@see TypeMatcher} or `null`. |
|||
*/ |
|||
private function first(array $elements, callable $predicate) |
|||
{ |
|||
foreach ($elements as $element) { |
|||
if (call_user_func($predicate, $element)) { |
|||
return $element; |
|||
} |
|||
} |
|||
|
|||
return null; |
|||
} |
|||
} |
@ -0,0 +1,9 @@ |
|||
<?php |
|||
|
|||
namespace DeepCopy\Exception; |
|||
|
|||
use UnexpectedValueException; |
|||
|
|||
class CloneException extends UnexpectedValueException |
|||
{ |
|||
} |
@ -0,0 +1,9 @@ |
|||
<?php |
|||
|
|||
namespace DeepCopy\Exception; |
|||
|
|||
use ReflectionException; |
|||
|
|||
class PropertyException extends ReflectionException |
|||
{ |
|||
} |
@ -0,0 +1,33 @@ |
|||
<?php |
|||
|
|||
namespace DeepCopy\Filter\Doctrine; |
|||
|
|||
use DeepCopy\Filter\Filter; |
|||
use DeepCopy\Reflection\ReflectionHelper; |
|||
|
|||
/** |
|||
* @final |
|||
*/ |
|||
class DoctrineCollectionFilter implements Filter |
|||
{ |
|||
/** |
|||
* Copies the object property doctrine collection. |
|||
* |
|||
* {@inheritdoc} |
|||
*/ |
|||
public function apply($object, $property, $objectCopier) |
|||
{ |
|||
$reflectionProperty = ReflectionHelper::getProperty($object, $property); |
|||
|
|||
$reflectionProperty->setAccessible(true); |
|||
$oldCollection = $reflectionProperty->getValue($object); |
|||
|
|||
$newCollection = $oldCollection->map( |
|||
function ($item) use ($objectCopier) { |
|||
return $objectCopier($item); |
|||
} |
|||
); |
|||
|
|||
$reflectionProperty->setValue($object, $newCollection); |
|||
} |
|||
} |
@ -0,0 +1,28 @@ |
|||
<?php |
|||
|
|||
namespace DeepCopy\Filter\Doctrine; |
|||
|
|||
use DeepCopy\Filter\Filter; |
|||
use DeepCopy\Reflection\ReflectionHelper; |
|||
use Doctrine\Common\Collections\ArrayCollection; |
|||
|
|||
/** |
|||
* @final |
|||
*/ |
|||
class DoctrineEmptyCollectionFilter implements Filter |
|||
{ |
|||
/** |
|||
* Sets the object property to an empty doctrine collection. |
|||
* |
|||
* @param object $object |
|||
* @param string $property |
|||
* @param callable $objectCopier |
|||
*/ |
|||
public function apply($object, $property, $objectCopier) |
|||
{ |
|||
$reflectionProperty = ReflectionHelper::getProperty($object, $property); |
|||
$reflectionProperty->setAccessible(true); |
|||
|
|||
$reflectionProperty->setValue($object, new ArrayCollection()); |
|||
} |
|||
} |
@ -0,0 +1,22 @@ |
|||
<?php |
|||
|
|||
namespace DeepCopy\Filter\Doctrine; |
|||
|
|||
use DeepCopy\Filter\Filter; |
|||
|
|||
/** |
|||
* @final |
|||
*/ |
|||
class DoctrineProxyFilter implements Filter |
|||
{ |
|||
/** |
|||
* Triggers the magic method __load() on a Doctrine Proxy class to load the |
|||
* actual entity from the database. |
|||
* |
|||
* {@inheritdoc} |
|||
*/ |
|||
public function apply($object, $property, $objectCopier) |
|||
{ |
|||
$object->__load(); |
|||
} |
|||
} |
@ -0,0 +1,18 @@ |
|||
<?php |
|||
|
|||
namespace DeepCopy\Filter; |
|||
|
|||
/** |
|||
* Filter to apply to a property while copying an object |
|||
*/ |
|||
interface Filter |
|||
{ |
|||
/** |
|||
* Applies the filter to the object. |
|||
* |
|||
* @param object $object |
|||
* @param string $property |
|||
* @param callable $objectCopier |
|||
*/ |
|||
public function apply($object, $property, $objectCopier); |
|||
} |
@ -0,0 +1,16 @@ |
|||
<?php |
|||
|
|||
namespace DeepCopy\Filter; |
|||
|
|||
class KeepFilter implements Filter |
|||
{ |
|||
/** |
|||
* Keeps the value of the object property. |
|||
* |
|||
* {@inheritdoc} |
|||
*/ |
|||
public function apply($object, $property, $objectCopier) |
|||
{ |
|||
// Nothing to do |
|||
} |
|||
} |
@ -0,0 +1,39 @@ |
|||
<?php |
|||
|
|||
namespace DeepCopy\Filter; |
|||
|
|||
use DeepCopy\Reflection\ReflectionHelper; |
|||
|
|||
/** |
|||
* @final |
|||
*/ |
|||
class ReplaceFilter implements Filter |
|||
{ |
|||
/** |
|||
* @var callable |
|||
*/ |
|||
protected $callback; |
|||
|
|||
/** |
|||
* @param callable $callable Will be called to get the new value for each property to replace |
|||
*/ |
|||
public function __construct(callable $callable) |
|||
{ |
|||
$this->callback = $callable; |
|||
} |
|||
|
|||
/** |
|||
* Replaces the object property by the result of the callback called with the object property. |
|||
* |
|||
* {@inheritdoc} |
|||
*/ |
|||
public function apply($object, $property, $objectCopier) |
|||
{ |
|||
$reflectionProperty = ReflectionHelper::getProperty($object, $property); |
|||
$reflectionProperty->setAccessible(true); |
|||
|
|||
$value = call_user_func($this->callback, $reflectionProperty->getValue($object)); |
|||
|
|||
$reflectionProperty->setValue($object, $value); |
|||
} |
|||
} |
@ -0,0 +1,24 @@ |
|||
<?php |
|||
|
|||
namespace DeepCopy\Filter; |
|||
|
|||
use DeepCopy\Reflection\ReflectionHelper; |
|||
|
|||
/** |
|||
* @final |
|||
*/ |
|||
class SetNullFilter implements Filter |
|||
{ |
|||
/** |
|||
* Sets the object property to null. |
|||
* |
|||
* {@inheritdoc} |
|||
*/ |
|||
public function apply($object, $property, $objectCopier) |
|||
{ |
|||
$reflectionProperty = ReflectionHelper::getProperty($object, $property); |
|||
|
|||
$reflectionProperty->setAccessible(true); |
|||
$reflectionProperty->setValue($object, null); |
|||
} |
|||
} |
@ -0,0 +1,22 @@ |
|||
<?php |
|||
|
|||
namespace DeepCopy\Matcher\Doctrine; |
|||
|
|||
use DeepCopy\Matcher\Matcher; |
|||
use Doctrine\Common\Persistence\Proxy; |
|||
|
|||
/** |
|||
* @final |
|||
*/ |
|||
class DoctrineProxyMatcher implements Matcher |
|||
{ |
|||
/** |
|||
* Matches a Doctrine Proxy class. |
|||
* |
|||
* {@inheritdoc} |
|||
*/ |
|||
public function matches($object, $property) |
|||
{ |
|||
return $object instanceof Proxy; |
|||
} |
|||
} |
@ -0,0 +1,14 @@ |
|||
<?php |
|||
|
|||
namespace DeepCopy\Matcher; |
|||
|
|||
interface Matcher |
|||
{ |
|||
/** |
|||
* @param object $object |
|||
* @param string $property |
|||
* |
|||
* @return boolean |
|||
*/ |
|||
public function matches($object, $property); |
|||
} |
@ -0,0 +1,39 @@ |
|||
<?php |
|||
|
|||
namespace DeepCopy\Matcher; |
|||
|
|||
/** |
|||
* @final |
|||
*/ |
|||
class PropertyMatcher implements Matcher |
|||
{ |
|||
/** |
|||
* @var string |
|||
*/ |
|||
private $class; |
|||
|
|||
/** |
|||
* @var string |
|||
*/ |
|||
private $property; |
|||
|
|||
/** |
|||
* @param string $class Class name |
|||
* @param string $property Property name |
|||
*/ |
|||
public function __construct($class, $property) |
|||
{ |
|||
$this->class = $class; |
|||
$this->property = $property; |
|||
} |
|||
|
|||
/** |
|||
* Matches a specific property of a specific class. |
|||
* |
|||
* {@inheritdoc} |
|||
*/ |
|||
public function matches($object, $property) |
|||
{ |
|||
return ($object instanceof $this->class) && $property == $this->property; |
|||
} |
|||
} |
@ -0,0 +1,32 @@ |
|||
<?php |
|||
|
|||
namespace DeepCopy\Matcher; |
|||
|
|||
/** |
|||
* @final |
|||
*/ |
|||
class PropertyNameMatcher implements Matcher |
|||
{ |
|||
/** |
|||
* @var string |
|||
*/ |
|||
private $property; |
|||
|
|||
/** |
|||
* @param string $property Property name |
|||
*/ |
|||
public function __construct($property) |
|||
{ |
|||
$this->property = $property; |
|||
} |
|||
|
|||
/** |
|||
* Matches a property by its name. |
|||
* |
|||
* {@inheritdoc} |
|||
*/ |
|||
public function matches($object, $property) |
|||
{ |
|||
return $property == $this->property; |
|||
} |
|||
} |
@ -0,0 +1,52 @@ |
|||
<?php |
|||
|
|||
namespace DeepCopy\Matcher; |
|||
|
|||
use DeepCopy\Reflection\ReflectionHelper; |
|||
use ReflectionException; |
|||
|
|||
/** |
|||
* Matches a property by its type. |
|||
* |
|||
* It is recommended to use {@see DeepCopy\TypeFilter\TypeFilter} instead, as it applies on all occurrences |
|||
* of given type in copied context (eg. array elements), not just on object properties. |
|||
* |
|||
* @final |
|||
*/ |
|||
class PropertyTypeMatcher implements Matcher |
|||
{ |
|||
/** |
|||
* @var string |
|||
*/ |
|||
private $propertyType; |
|||
|
|||
/** |
|||
* @param string $propertyType Property type |
|||
*/ |
|||
public function __construct($propertyType) |
|||
{ |
|||
$this->propertyType = $propertyType; |
|||
} |
|||
|
|||
/** |
|||
* {@inheritdoc} |
|||
*/ |
|||
public function matches($object, $property) |
|||
{ |
|||
try { |
|||
$reflectionProperty = ReflectionHelper::getProperty($object, $property); |
|||
} catch (ReflectionException $exception) { |
|||
return false; |
|||
} |
|||
|
|||
$reflectionProperty->setAccessible(true); |
|||
|
|||
// Uninitialized properties (for PHP >7.4) |
|||
if (method_exists($reflectionProperty, 'isInitialized') && !$reflectionProperty->isInitialized($object)) { |
|||
// null instanceof $this->propertyType |
|||
return false; |
|||
} |
|||
|
|||
return $reflectionProperty->getValue($object) instanceof $this->propertyType; |
|||
} |
|||
} |
@ -0,0 +1,78 @@ |
|||
<?php |
|||
|
|||
namespace DeepCopy\Reflection; |
|||
|
|||
use DeepCopy\Exception\PropertyException; |
|||
use ReflectionClass; |
|||
use ReflectionException; |
|||
use ReflectionObject; |
|||
use ReflectionProperty; |
|||
|
|||
class ReflectionHelper |
|||
{ |
|||
/** |
|||
* Retrieves all properties (including private ones), from object and all its ancestors. |
|||
* |
|||
* Standard \ReflectionClass->getProperties() does not return private properties from ancestor classes. |
|||
* |
|||
* @author [email protected] |
|||
* @see http://php.net/manual/en/reflectionclass.getproperties.php |
|||
* |
|||
* @param ReflectionClass $ref |
|||
* |
|||
* @return ReflectionProperty[] |
|||
*/ |
|||
public static function getProperties(ReflectionClass $ref) |
|||
{ |
|||
$props = $ref->getProperties(); |
|||
$propsArr = array(); |
|||
|
|||
foreach ($props as $prop) { |
|||
$propertyName = $prop->getName(); |
|||
$propsArr[$propertyName] = $prop; |
|||
} |
|||
|
|||
if ($parentClass = $ref->getParentClass()) { |
|||
$parentPropsArr = self::getProperties($parentClass); |
|||
foreach ($propsArr as $key => $property) { |
|||
$parentPropsArr[$key] = $property; |
|||
} |
|||
|
|||
return $parentPropsArr; |
|||
} |
|||
|
|||
return $propsArr; |
|||
} |
|||
|
|||
/** |
|||
* Retrieves property by name from object and all its ancestors. |
|||
* |
|||
* @param object|string $object |
|||
* @param string $name |
|||
* |
|||
* @throws PropertyException |
|||
* @throws ReflectionException |
|||
* |
|||
* @return ReflectionProperty |
|||
*/ |
|||
public static function getProperty($object, $name) |
|||
{ |
|||
$reflection = is_object($object) ? new ReflectionObject($object) : new ReflectionClass($object); |
|||
|
|||
if ($reflection->hasProperty($name)) { |
|||
return $reflection->getProperty($name); |
|||
} |
|||
|
|||
if ($parentClass = $reflection->getParentClass()) { |
|||
return self::getProperty($parentClass->getName(), $name); |
|||
} |
|||
|
|||
throw new PropertyException( |
|||
sprintf( |
|||
'The class "%s" doesn\'t have a property with the given name: "%s".', |
|||
is_object($object) ? get_class($object) : $object, |
|||
$name |
|||
) |
|||
); |
|||
} |
|||
} |
@ -0,0 +1,33 @@ |
|||
<?php |
|||
|
|||
namespace DeepCopy\TypeFilter\Date; |
|||
|
|||
use DateInterval; |
|||
use DeepCopy\TypeFilter\TypeFilter; |
|||
|
|||
/** |
|||
* @final |
|||
* |
|||
* @deprecated Will be removed in 2.0. This filter will no longer be necessary in PHP 7.1+. |
|||
*/ |
|||
class DateIntervalFilter implements TypeFilter |
|||
{ |
|||
|
|||
/** |
|||
* {@inheritdoc} |
|||
* |
|||
* @param DateInterval $element |
|||
* |
|||
* @see http://news.php.net/php.bugs/205076 |
|||
*/ |
|||
public function apply($element) |
|||
{ |
|||
$copy = new DateInterval('P0D'); |
|||
|
|||
foreach ($element as $propertyName => $propertyValue) { |
|||
$copy->{$propertyName} = $propertyValue; |
|||
} |
|||
|
|||
return $copy; |
|||
} |
|||
} |
@ -0,0 +1,30 @@ |
|||
<?php |
|||
|
|||
namespace DeepCopy\TypeFilter; |
|||
|
|||
/** |
|||
* @final |
|||
*/ |
|||
class ReplaceFilter implements TypeFilter |
|||
{ |
|||
/** |
|||
* @var callable |
|||
*/ |
|||
protected $callback; |
|||
|
|||
/** |
|||
* @param callable $callable Will be called to get the new value for each element to replace |
|||
*/ |
|||
public function __construct(callable $callable) |
|||
{ |
|||
$this->callback = $callable; |
|||
} |
|||
|
|||
/** |
|||
* {@inheritdoc} |
|||
*/ |
|||
public function apply($element) |
|||
{ |
|||
return call_user_func($this->callback, $element); |
|||
} |
|||
} |
@ -0,0 +1,17 @@ |
|||
<?php |
|||
|
|||
namespace DeepCopy\TypeFilter; |
|||
|
|||
/** |
|||
* @final |
|||
*/ |
|||
class ShallowCopyFilter implements TypeFilter |
|||
{ |
|||
/** |
|||
* {@inheritdoc} |
|||
*/ |
|||
public function apply($element) |
|||
{ |
|||
return clone $element; |
|||
} |
|||
} |
@ -0,0 +1,36 @@ |
|||
<?php |
|||
namespace DeepCopy\TypeFilter\Spl; |
|||
|
|||
use DeepCopy\DeepCopy; |
|||
use DeepCopy\TypeFilter\TypeFilter; |
|||
|
|||
/** |
|||
* In PHP 7.4 the storage of an ArrayObject isn't returned as |
|||
* ReflectionProperty. So we deep copy its array copy. |
|||
*/ |
|||
final class ArrayObjectFilter implements TypeFilter |
|||
{ |
|||
/** |
|||
* @var DeepCopy |
|||
*/ |
|||
private $copier; |
|||
|
|||
public function __construct(DeepCopy $copier) |
|||
{ |
|||
$this->copier = $copier; |
|||
} |
|||
|
|||
/** |
|||
* {@inheritdoc} |
|||
*/ |
|||
public function apply($arrayObject) |
|||
{ |
|||
$clone = clone $arrayObject; |
|||
foreach ($arrayObject->getArrayCopy() as $k => $v) { |
|||
$clone->offsetSet($k, $this->copier->copy($v)); |
|||
} |
|||
|
|||
return $clone; |
|||
} |
|||
} |
|||
|
@ -0,0 +1,10 @@ |
|||
<?php |
|||
|
|||
namespace DeepCopy\TypeFilter\Spl; |
|||
|
|||
/** |
|||
* @deprecated Use {@see SplDoublyLinkedListFilter} instead. |
|||
*/ |
|||
class SplDoublyLinkedList extends SplDoublyLinkedListFilter |
|||
{ |
|||
} |
@ -0,0 +1,51 @@ |
|||
<?php |
|||
|
|||
namespace DeepCopy\TypeFilter\Spl; |
|||
|
|||
use Closure; |
|||
use DeepCopy\DeepCopy; |
|||
use DeepCopy\TypeFilter\TypeFilter; |
|||
use SplDoublyLinkedList; |
|||
|
|||
/** |
|||
* @final |
|||
*/ |
|||
class SplDoublyLinkedListFilter implements TypeFilter |
|||
{ |
|||
private $copier; |
|||
|
|||
public function __construct(DeepCopy $copier) |
|||
{ |
|||
$this->copier = $copier; |
|||
} |
|||
|
|||
/** |
|||
* {@inheritdoc} |
|||
*/ |
|||
public function apply($element) |
|||
{ |
|||
$newElement = clone $element; |
|||
|
|||
$copy = $this->createCopyClosure(); |
|||
|
|||
return $copy($newElement); |
|||
} |
|||
|
|||
private function createCopyClosure() |
|||
{ |
|||
$copier = $this->copier; |
|||
|
|||
$copy = function (SplDoublyLinkedList $list) use ($copier) { |
|||
// Replace each element in the list with a deep copy of itself |
|||
for ($i = 1; $i <= $list->count(); $i++) { |
|||
$copy = $copier->recursiveCopy($list->shift()); |
|||
|
|||
$list->push($copy); |
|||
} |
|||
|
|||
return $list; |
|||
}; |
|||
|
|||
return Closure::bind($copy, null, DeepCopy::class); |
|||
} |
|||
} |
@ -0,0 +1,13 @@ |
|||
<?php |
|||
|
|||
namespace DeepCopy\TypeFilter; |
|||
|
|||
interface TypeFilter |
|||
{ |
|||
/** |
|||
* Applies the filter to the object. |
|||
* |
|||
* @param mixed $element |
|||
*/ |
|||
public function apply($element); |
|||
} |
@ -0,0 +1,29 @@ |
|||
<?php |
|||
|
|||
namespace DeepCopy\TypeMatcher; |
|||
|
|||
class TypeMatcher |
|||
{ |
|||
/** |
|||
* @var string |
|||
*/ |
|||
private $type; |
|||
|
|||
/** |
|||
* @param string $type |
|||
*/ |
|||
public function __construct($type) |
|||
{ |
|||
$this->type = $type; |
|||
} |
|||
|
|||
/** |
|||
* @param mixed $element |
|||
* |
|||
* @return boolean |
|||
*/ |
|||
public function matches($element) |
|||
{ |
|||
return is_object($element) ? is_a($element, $this->type) : gettype($element) === $this->type; |
|||
} |
|||
} |
@ -0,0 +1,20 @@ |
|||
<?php |
|||
|
|||
namespace DeepCopy; |
|||
|
|||
use function function_exists; |
|||
|
|||
if (false === function_exists('DeepCopy\deep_copy')) { |
|||
/** |
|||
* Deep copies the given value. |
|||
* |
|||
* @param mixed $value |
|||
* @param bool $useCloneMethod |
|||
* |
|||
* @return mixed |
|||
*/ |
|||
function deep_copy($value, $useCloneMethod = false) |
|||
{ |
|||
return (new DeepCopy($useCloneMethod))->copy($value); |
|||
} |
|||
} |
@ -0,0 +1,7 @@ |
|||
version: 2 |
|||
updates: |
|||
- package-ecosystem: composer |
|||
directory: "/" |
|||
schedule: |
|||
interval: daily |
|||
open-pull-requests-limit: 10 |
@ -0,0 +1,223 @@ |
|||
on: |
|||
push: |
|||
branches: |
|||
- 2.x |
|||
pull_request: |
|||
name: Qa workflow |
|||
jobs: |
|||
setup: |
|||
runs-on: ubuntu-latest |
|||
steps: |
|||
- uses: actions/checkout@v2 |
|||
|
|||
- name: Restore/cache vendor folder |
|||
uses: actions/cache@v1 |
|||
with: |
|||
path: vendor |
|||
key: all-build-${{ hashFiles('**/composer.lock') }} |
|||
restore-keys: | |
|||
all-build-${{ hashFiles('**/composer.lock') }} |
|||
all-build- |
|||
|
|||
- name: Restore/cache tools folder |
|||
uses: actions/cache@v1 |
|||
with: |
|||
path: tools |
|||
key: all-tools-${{ github.sha }} |
|||
restore-keys: | |
|||
all-tools-${{ github.sha }}- |
|||
all-tools- |
|||
|
|||
- name: composer |
|||
uses: docker://composer |
|||
env: |
|||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
|||
with: |
|||
args: install --no-interaction --prefer-dist --optimize-autoloader |
|||
|
|||
- name: Install phive |
|||
run: make install-phive |
|||
|
|||
- name: Install PHAR dependencies |
|||
run: tools/phive.phar --no-progress install --copy --trust-gpg-keys 4AA394086372C20A,8A03EA3B385DBAA1 --force-accept-unsigned |
|||
|
|||
phpunit-with-coverage: |
|||
runs-on: ubuntu-latest |
|||
name: Unit tests |
|||
needs: setup |
|||
steps: |
|||
- uses: actions/checkout@v2 |
|||
|
|||
- name: Setup PHP |
|||
uses: shivammathur/setup-php@v2 |
|||
with: |
|||
php-version: 7.2 |
|||
ini-values: memory_limit=2G, display_errors=On, error_reporting=-1 |
|||
coverage: pcov |
|||
|
|||
- name: Restore/cache tools folder |
|||
uses: actions/cache@v1 |
|||
with: |
|||
path: tools |
|||
key: all-tools-${{ github.sha }} |
|||
restore-keys: | |
|||
all-tools-${{ github.sha }}- |
|||
all-tools- |
|||
|
|||
- name: Get composer cache directory |
|||
id: composer-cache |
|||
run: echo "::set-output name=dir::$(composer config cache-files-dir)" |
|||
|
|||
- name: Cache composer dependencies |
|||
uses: actions/cache@v1 |
|||
with: |
|||
path: ${{ steps.composer-cache.outputs.dir }} |
|||
key: ubuntu-latest-composer-${{ hashFiles('**/composer.lock') }} |
|||
restore-keys: ubuntu-latest-composer- |
|||
|
|||
- name: Install Composer dependencies |
|||
run: | |
|||
composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader |
|||
|
|||
- name: Run PHPUnit |
|||
run: php tools/phpunit |
|||
|
|||
phpunit: |
|||
runs-on: ${{ matrix.operating-system }} |
|||
strategy: |
|||
matrix: |
|||
operating-system: |
|||
- ubuntu-latest |
|||
- windows-latest |
|||
- macOS-latest |
|||
php-versions: ['7.2', '7.3', '7.4', '8.0'] |
|||
name: Unit tests for PHP version ${{ matrix.php-versions }} on ${{ matrix.operating-system }} |
|||
needs: |
|||
- setup |
|||
- phpunit-with-coverage |
|||
steps: |
|||
- uses: actions/checkout@v2 |
|||
|
|||
- name: Restore/cache tools folder |
|||
uses: actions/cache@v1 |
|||
with: |
|||
path: tools |
|||
key: all-tools-${{ github.sha }} |
|||
restore-keys: | |
|||
all-tools-${{ github.sha }}- |
|||
all-tools- |
|||
|
|||
- name: Setup PHP |
|||
uses: shivammathur/setup-php@v2 |
|||
with: |
|||
php-version: ${{ matrix.php-versions }} |
|||
ini-values: memory_limit=2G, display_errors=On, error_reporting=-1 |
|||
coverage: none |
|||
|
|||
- name: Get composer cache directory |
|||
id: composer-cache |
|||
run: echo "::set-output name=dir::$(composer config cache-files-dir)" |
|||
|
|||
- name: Cache composer dependencies |
|||
uses: actions/cache@v1 |
|||
with: |
|||
path: ${{ steps.composer-cache.outputs.dir }} |
|||
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} |
|||
restore-keys: ${{ runner.os }}-composer- |
|||
|
|||
- name: Install Composer dependencies |
|||
run: | |
|||
composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader |
|||
|
|||
- name: Run PHPUnit |
|||
continue-on-error: true |
|||
run: php tools/phpunit |
|||
|
|||
codestyle: |
|||
runs-on: ubuntu-latest |
|||
needs: [setup, phpunit] |
|||
steps: |
|||
- uses: actions/checkout@v2 |
|||
- name: Restore/cache vendor folder |
|||
uses: actions/cache@v1 |
|||
with: |
|||
path: vendor |
|||
key: all-build-${{ hashFiles('**/composer.lock') }} |
|||
restore-keys: | |
|||
all-build-${{ hashFiles('**/composer.lock') }} |
|||
all-build- |
|||
- name: Code style check |
|||
uses: phpDocumentor/coding-standard@latest |
|||
with: |
|||
args: -s |
|||
|
|||
phpstan: |
|||
runs-on: ubuntu-latest |
|||
needs: [setup, phpunit] |
|||
steps: |
|||
- uses: actions/checkout@v2 |
|||
- name: Restore/cache vendor folder |
|||
uses: actions/cache@v1 |
|||
with: |
|||
path: vendor |
|||
key: all-build-${{ hashFiles('**/composer.lock') }} |
|||
restore-keys: | |
|||
all-build-${{ hashFiles('**/composer.lock') }} |
|||
all-build- |
|||
- name: PHPStan |
|||
uses: phpDocumentor/phpstan-ga@latest |
|||
env: |
|||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
|||
with: |
|||
args: analyse src --configuration phpstan.neon |
|||
|
|||
psalm: |
|||
runs-on: ubuntu-latest |
|||
needs: [setup, phpunit] |
|||
steps: |
|||
- uses: actions/checkout@v2 |
|||
|
|||
- name: Setup PHP |
|||
uses: shivammathur/setup-php@v2 |
|||
with: |
|||
php-version: 7.2 |
|||
ini-values: memory_limit=2G, display_errors=On, error_reporting=-1 |
|||
tools: psalm |
|||
coverage: none |
|||
|
|||
- name: Get composer cache directory |
|||
id: composer-cache |
|||
run: echo "::set-output name=dir::$(composer config cache-files-dir)" |
|||
|
|||
- name: Cache composer dependencies |
|||
uses: actions/cache@v1 |
|||
with: |
|||
path: ${{ steps.composer-cache.outputs.dir }} |
|||
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} |
|||
restore-keys: ${{ runner.os }}-composer- |
|||
|
|||
- name: Install Composer dependencies |
|||
run: | |
|||
composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader |
|||
|
|||
- name: Psalm |
|||
run: psalm --output-format=github |
|||
|
|||
bc_check: |
|||
name: BC Check |
|||
runs-on: ubuntu-latest |
|||
needs: [setup, phpunit] |
|||
steps: |
|||
- uses: actions/checkout@v2 |
|||
- name: fetch tags |
|||
run: git fetch --depth=1 origin +refs/tags/*:refs/tags/* |
|||
- name: Restore/cache vendor folder |
|||
uses: actions/cache@v1 |
|||
with: |
|||
path: vendor |
|||
key: all-build-${{ hashFiles('**/composer.lock') }} |
|||
restore-keys: | |
|||
all-build-${{ hashFiles('**/composer.lock') }} |
|||
all-build- |
|||
- name: Roave BC Check |
|||
uses: docker://nyholm/roave-bc-check-ga |
@ -0,0 +1,22 @@ |
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2015 phpDocumentor |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in all |
|||
copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
SOFTWARE. |
|||
|
@ -0,0 +1,11 @@ |
|||
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) |
|||
![Qa workflow](https://github.com/phpDocumentor/ReflectionCommon/workflows/Qa%20workflow/badge.svg) |
|||
[![Coveralls Coverage](https://img.shields.io/coveralls/github/phpDocumentor/ReflectionCommon.svg)](https://coveralls.io/github/phpDocumentor/ReflectionCommon?branch=master) |
|||
[![Scrutinizer Code Coverage](https://img.shields.io/scrutinizer/coverage/g/phpDocumentor/ReflectionCommon.svg)](https://scrutinizer-ci.com/g/phpDocumentor/ReflectionCommon/?branch=master) |
|||
[![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/phpDocumentor/ReflectionCommon.svg)](https://scrutinizer-ci.com/g/phpDocumentor/ReflectionCommon/?branch=master) |
|||
[![Stable Version](https://img.shields.io/packagist/v/phpDocumentor/Reflection-Common.svg)](https://packagist.org/packages/phpDocumentor/Reflection-Common) |
|||
[![Unstable Version](https://img.shields.io/packagist/vpre/phpDocumentor/Reflection-Common.svg)](https://packagist.org/packages/phpDocumentor/Reflection-Common) |
|||
|
|||
|
|||
ReflectionCommon |
|||
================ |
@ -0,0 +1,28 @@ |
|||
{ |
|||
"name": "phpdocumentor/reflection-common", |
|||
"keywords": ["phpdoc", "phpDocumentor", "reflection", "static analysis", "FQSEN"], |
|||
"homepage": "http://www.phpdoc.org", |
|||
"description": "Common reflection classes used by phpdocumentor to reflect the code structure", |
|||
"license": "MIT", |
|||
"authors": [ |
|||
{ |
|||
"name": "Jaap van Otterdijk", |
|||
"email": "[email protected]" |
|||
} |
|||
], |
|||
"require": { |
|||
"php": "^7.2 || ^8.0" |
|||
}, |
|||
"autoload" : { |
|||
"psr-4" : { |
|||
"phpDocumentor\\Reflection\\": "src/" |
|||
} |
|||
}, |
|||
"require-dev": { |
|||
}, |
|||
"extra": { |
|||
"branch-alias": { |
|||
"dev-2.x": "2.x-dev" |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,30 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* phpDocumentor |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
* |
|||
* @link http://phpdoc.org |
|||
*/ |
|||
|
|||
namespace phpDocumentor\Reflection; |
|||
|
|||
/** |
|||
* Interface for Api Elements |
|||
*/ |
|||
interface Element |
|||
{ |
|||
/** |
|||
* Returns the Fqsen of the element. |
|||
*/ |
|||
public function getFqsen() : Fqsen; |
|||
|
|||
/** |
|||
* Returns the name of the element. |
|||
*/ |
|||
public function getName() : string; |
|||
} |
@ -0,0 +1,35 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* This file is part of phpDocumentor. |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
* |
|||
* @link http://phpdoc.org |
|||
*/ |
|||
|
|||
namespace phpDocumentor\Reflection; |
|||
|
|||
/** |
|||
* Interface for files processed by the ProjectFactory |
|||
*/ |
|||
interface File |
|||
{ |
|||
/** |
|||
* Returns the content of the file as a string. |
|||
*/ |
|||
public function getContents() : string; |
|||
|
|||
/** |
|||
* Returns md5 hash of the file. |
|||
*/ |
|||
public function md5() : string; |
|||
|
|||
/** |
|||
* Returns an relative path to the file. |
|||
*/ |
|||
public function path() : string; |
|||
} |
@ -0,0 +1,89 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* phpDocumentor |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
* |
|||
* @link http://phpdoc.org |
|||
*/ |
|||
|
|||
namespace phpDocumentor\Reflection; |
|||
|
|||
use InvalidArgumentException; |
|||
use function assert; |
|||
use function end; |
|||
use function explode; |
|||
use function is_string; |
|||
use function preg_match; |
|||
use function sprintf; |
|||
use function trim; |
|||
|
|||
/** |
|||
* Value Object for Fqsen. |
|||
* |
|||
* @link https://github.com/phpDocumentor/fig-standards/blob/master/proposed/phpdoc-meta.md |
|||
* |
|||
* @psalm-immutable |
|||
*/ |
|||
final class Fqsen |
|||
{ |
|||
/** @var string full quallified class name */ |
|||
private $fqsen; |
|||
|
|||
/** @var string name of the element without path. */ |
|||
private $name; |
|||
|
|||
/** |
|||
* Initializes the object. |
|||
* |
|||
* @throws InvalidArgumentException when $fqsen is not matching the format. |
|||
*/ |
|||
public function __construct(string $fqsen) |
|||
{ |
|||
$matches = []; |
|||
|
|||
$result = preg_match( |
|||
//phpcs:ignore Generic.Files.LineLength.TooLong |
|||
'/^\\\\([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff\\\\]*)?(?:[:]{2}\\$?([a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*))?(?:\\(\\))?$/', |
|||
$fqsen, |
|||
$matches |
|||
); |
|||
|
|||
if ($result === 0) { |
|||
throw new InvalidArgumentException( |
|||
sprintf('"%s" is not a valid Fqsen.', $fqsen) |
|||
); |
|||
} |
|||
|
|||
$this->fqsen = $fqsen; |
|||
|
|||
if (isset($matches[2])) { |
|||
$this->name = $matches[2]; |
|||
} else { |
|||
$matches = explode('\\', $fqsen); |
|||
$name = end($matches); |
|||
assert(is_string($name)); |
|||
$this->name = trim($name, '()'); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* converts this class to string. |
|||
*/ |
|||
public function __toString() : string |
|||
{ |
|||
return $this->fqsen; |
|||
} |
|||
|
|||
/** |
|||
* Returns the name of the element without path. |
|||
*/ |
|||
public function getName() : string |
|||
{ |
|||
return $this->name; |
|||
} |
|||
} |
@ -0,0 +1,53 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* This file is part of phpDocumentor. |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
* |
|||
* @link http://phpdoc.org |
|||
*/ |
|||
|
|||
namespace phpDocumentor\Reflection; |
|||
|
|||
/** |
|||
* The location where an element occurs within a file. |
|||
* |
|||
* @psalm-immutable |
|||
*/ |
|||
final class Location |
|||
{ |
|||
/** @var int */ |
|||
private $lineNumber = 0; |
|||
|
|||
/** @var int */ |
|||
private $columnNumber = 0; |
|||
|
|||
/** |
|||
* Initializes the location for an element using its line number in the file and optionally the column number. |
|||
*/ |
|||
public function __construct(int $lineNumber, int $columnNumber = 0) |
|||
{ |
|||
$this->lineNumber = $lineNumber; |
|||
$this->columnNumber = $columnNumber; |
|||
} |
|||
|
|||
/** |
|||
* Returns the line number that is covered by this location. |
|||
*/ |
|||
public function getLineNumber() : int |
|||
{ |
|||
return $this->lineNumber; |
|||
} |
|||
|
|||
/** |
|||
* Returns the column number (character position on a line) for this location object. |
|||
*/ |
|||
public function getColumnNumber() : int |
|||
{ |
|||
return $this->columnNumber; |
|||
} |
|||
} |
@ -0,0 +1,25 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* phpDocumentor |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
* |
|||
* @link http://phpdoc.org |
|||
*/ |
|||
|
|||
namespace phpDocumentor\Reflection; |
|||
|
|||
/** |
|||
* Interface for project. Since the definition of a project can be different per factory this interface will be small. |
|||
*/ |
|||
interface Project |
|||
{ |
|||
/** |
|||
* Returns the name of the project. |
|||
*/ |
|||
public function getName() : string; |
|||
} |
@ -0,0 +1,28 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* phpDocumentor |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
* |
|||
* @link http://phpdoc.org |
|||
*/ |
|||
|
|||
namespace phpDocumentor\Reflection; |
|||
|
|||
/** |
|||
* Interface for project factories. A project factory shall convert a set of files |
|||
* into an object implementing the Project interface. |
|||
*/ |
|||
interface ProjectFactory |
|||
{ |
|||
/** |
|||
* Creates a project from the set of files. |
|||
* |
|||
* @param File[] $files |
|||
*/ |
|||
public function create(string $name, array $files) : Project; |
|||
} |
@ -0,0 +1,21 @@ |
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2010 Mike van Riel |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in |
|||
all copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
THE SOFTWARE. |
@ -0,0 +1,75 @@ |
|||
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) |
|||
![Qa workflow](https://github.com/phpDocumentor/ReflectionDocBlock/workflows/Qa%20workflow/badge.svg) |
|||
[![Coveralls Coverage](https://img.shields.io/coveralls/github/phpDocumentor/ReflectionDocBlock.svg)](https://coveralls.io/github/phpDocumentor/ReflectionDocBlock?branch=master) |
|||
[![Scrutinizer Code Coverage](https://img.shields.io/scrutinizer/coverage/g/phpDocumentor/ReflectionDocBlock.svg)](https://scrutinizer-ci.com/g/phpDocumentor/ReflectionDocBlock/?branch=master) |
|||
[![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/phpDocumentor/ReflectionDocBlock.svg)](https://scrutinizer-ci.com/g/phpDocumentor/ReflectionDocBlock/?branch=master) |
|||
[![Stable Version](https://img.shields.io/packagist/v/phpdocumentor/reflection-docblock.svg)](https://packagist.org/packages/phpdocumentor/reflection-docblock) |
|||
[![Unstable Version](https://img.shields.io/packagist/vpre/phpdocumentor/reflection-docblock.svg)](https://packagist.org/packages/phpdocumentor/reflection-docblock) |
|||
|
|||
ReflectionDocBlock |
|||
================== |
|||
|
|||
Introduction |
|||
------------ |
|||
|
|||
The ReflectionDocBlock component of phpDocumentor provides a DocBlock parser |
|||
that is 100% compatible with the [PHPDoc standard](http://phpdoc.org/docs/latest). |
|||
|
|||
With this component, a library can provide support for annotations via DocBlocks |
|||
or otherwise retrieve information that is embedded in a DocBlock. |
|||
|
|||
Installation |
|||
------------ |
|||
|
|||
```bash |
|||
composer require phpdocumentor/reflection-docblock |
|||
``` |
|||
|
|||
Usage |
|||
----- |
|||
|
|||
In order to parse the DocBlock one needs a DocBlockFactory that can be |
|||
instantiated using its `createInstance` factory method like this: |
|||
|
|||
```php |
|||
$factory = \phpDocumentor\Reflection\DocBlockFactory::createInstance(); |
|||
``` |
|||
|
|||
Then we can use the `create` method of the factory to interpret the DocBlock. |
|||
Please note that it is also possible to provide a class that has the |
|||
`getDocComment()` method, such as an object of type `ReflectionClass`, the |
|||
create method will read that if it exists. |
|||
|
|||
```php |
|||
$docComment = <<<DOCCOMMENT |
|||
/** |
|||
* This is an example of a summary. |
|||
* |
|||
* This is a Description. A Summary and Description are separated by either |
|||
* two subsequent newlines (thus a whiteline in between as can be seen in this |
|||
* example), or when the Summary ends with a dot (`.`) and some form of |
|||
* whitespace. |
|||
*/ |
|||
DOCCOMMENT; |
|||
|
|||
$docblock = $factory->create($docComment); |
|||
``` |
|||
|
|||
The `create` method will yield an object of type `\phpDocumentor\Reflection\DocBlock` |
|||
whose methods can be queried: |
|||
|
|||
```php |
|||
// Contains the summary for this DocBlock |
|||
$summary = $docblock->getSummary(); |
|||
|
|||
// Contains \phpDocumentor\Reflection\DocBlock\Description object |
|||
$description = $docblock->getDescription(); |
|||
|
|||
// You can either cast it to string |
|||
$description = (string) $docblock->getDescription(); |
|||
|
|||
// Or use the render method to get a string representation of the Description. |
|||
$description = $docblock->getDescription()->render(); |
|||
``` |
|||
|
|||
> For more examples it would be best to review the scripts in the [`/examples` folder](/examples). |
@ -0,0 +1,41 @@ |
|||
{ |
|||
"name": "phpdocumentor/reflection-docblock", |
|||
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", |
|||
"type": "library", |
|||
"license": "MIT", |
|||
"authors": [ |
|||
{ |
|||
"name": "Mike van Riel", |
|||
"email": "[email protected]" |
|||
}, |
|||
{ |
|||
"name": "Jaap van Otterdijk", |
|||
"email": "[email protected]" |
|||
} |
|||
], |
|||
"require": { |
|||
"php": "^7.2 || ^8.0", |
|||
"phpdocumentor/type-resolver": "^1.3", |
|||
"webmozart/assert": "^1.9.1", |
|||
"phpdocumentor/reflection-common": "^2.2", |
|||
"ext-filter": "*" |
|||
}, |
|||
"require-dev": { |
|||
"mockery/mockery": "~1.3.2" |
|||
}, |
|||
"autoload": { |
|||
"psr-4": { |
|||
"phpDocumentor\\Reflection\\": "src" |
|||
} |
|||
}, |
|||
"autoload-dev": { |
|||
"psr-4": { |
|||
"phpDocumentor\\Reflection\\": "tests/unit" |
|||
} |
|||
}, |
|||
"extra": { |
|||
"branch-alias": { |
|||
"dev-master": "5.x-dev" |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,204 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* This file is part of phpDocumentor. |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
* |
|||
* @link http://phpdoc.org |
|||
*/ |
|||
|
|||
namespace phpDocumentor\Reflection; |
|||
|
|||
use phpDocumentor\Reflection\DocBlock\Tag; |
|||
use Webmozart\Assert\Assert; |
|||
|
|||
final class DocBlock |
|||
{ |
|||
/** @var string The opening line for this docblock. */ |
|||
private $summary; |
|||
|
|||
/** @var DocBlock\Description The actual description for this docblock. */ |
|||
private $description; |
|||
|
|||
/** @var Tag[] An array containing all the tags in this docblock; except inline. */ |
|||
private $tags = []; |
|||
|
|||
/** @var Types\Context|null Information about the context of this DocBlock. */ |
|||
private $context; |
|||
|
|||
/** @var Location|null Information about the location of this DocBlock. */ |
|||
private $location; |
|||
|
|||
/** @var bool Is this DocBlock (the start of) a template? */ |
|||
private $isTemplateStart; |
|||
|
|||
/** @var bool Does this DocBlock signify the end of a DocBlock template? */ |
|||
private $isTemplateEnd; |
|||
|
|||
/** |
|||
* @param DocBlock\Tag[] $tags |
|||
* @param Types\Context $context The context in which the DocBlock occurs. |
|||
* @param Location $location The location within the file that this DocBlock occurs in. |
|||
*/ |
|||
public function __construct( |
|||
string $summary = '', |
|||
?DocBlock\Description $description = null, |
|||
array $tags = [], |
|||
?Types\Context $context = null, |
|||
?Location $location = null, |
|||
bool $isTemplateStart = false, |
|||
bool $isTemplateEnd = false |
|||
) { |
|||
Assert::allIsInstanceOf($tags, Tag::class); |
|||
|
|||
$this->summary = $summary; |
|||
$this->description = $description ?: new DocBlock\Description(''); |
|||
foreach ($tags as $tag) { |
|||
$this->addTag($tag); |
|||
} |
|||
|
|||
$this->context = $context; |
|||
$this->location = $location; |
|||
|
|||
$this->isTemplateEnd = $isTemplateEnd; |
|||
$this->isTemplateStart = $isTemplateStart; |
|||
} |
|||
|
|||
public function getSummary() : string |
|||
{ |
|||
return $this->summary; |
|||
} |
|||
|
|||
public function getDescription() : DocBlock\Description |
|||
{ |
|||
return $this->description; |
|||
} |
|||
|
|||
/** |
|||
* Returns the current context. |
|||
*/ |
|||
public function getContext() : ?Types\Context |
|||
{ |
|||
return $this->context; |
|||
} |
|||
|
|||
/** |
|||
* Returns the current location. |
|||
*/ |
|||
public function getLocation() : ?Location |
|||
{ |
|||
return $this->location; |
|||
} |
|||
|
|||
/** |
|||
* Returns whether this DocBlock is the start of a Template section. |
|||
* |
|||
* A Docblock may serve as template for a series of subsequent DocBlocks. This is indicated by a special marker |
|||
* (`#@+`) that is appended directly after the opening `/**` of a DocBlock. |
|||
* |
|||
* An example of such an opening is: |
|||
* |
|||
* ``` |
|||
* /**#@+ |
|||
* * My DocBlock |
|||
* * / |
|||
* ``` |
|||
* |
|||
* The description and tags (not the summary!) are copied onto all subsequent DocBlocks and also applied to all |
|||
* elements that follow until another DocBlock is found that contains the closing marker (`#@-`). |
|||
* |
|||
* @see self::isTemplateEnd() for the check whether a closing marker was provided. |
|||
*/ |
|||
public function isTemplateStart() : bool |
|||
{ |
|||
return $this->isTemplateStart; |
|||
} |
|||
|
|||
/** |
|||
* Returns whether this DocBlock is the end of a Template section. |
|||
* |
|||
* @see self::isTemplateStart() for a more complete description of the Docblock Template functionality. |
|||
*/ |
|||
public function isTemplateEnd() : bool |
|||
{ |
|||
return $this->isTemplateEnd; |
|||
} |
|||
|
|||
/** |
|||
* Returns the tags for this DocBlock. |
|||
* |
|||
* @return Tag[] |
|||
*/ |
|||
public function getTags() : array |
|||
{ |
|||
return $this->tags; |
|||
} |
|||
|
|||
/** |
|||
* Returns an array of tags matching the given name. If no tags are found |
|||
* an empty array is returned. |
|||
* |
|||
* @param string $name String to search by. |
|||
* |
|||
* @return Tag[] |
|||
*/ |
|||
public function getTagsByName(string $name) : array |
|||
{ |
|||
$result = []; |
|||
|
|||
foreach ($this->getTags() as $tag) { |
|||
if ($tag->getName() !== $name) { |
|||
continue; |
|||
} |
|||
|
|||
$result[] = $tag; |
|||
} |
|||
|
|||
return $result; |
|||
} |
|||
|
|||
/** |
|||
* Checks if a tag of a certain type is present in this DocBlock. |
|||
* |
|||
* @param string $name Tag name to check for. |
|||
*/ |
|||
public function hasTag(string $name) : bool |
|||
{ |
|||
foreach ($this->getTags() as $tag) { |
|||
if ($tag->getName() === $name) { |
|||
return true; |
|||
} |
|||
} |
|||
|
|||
return false; |
|||
} |
|||
|
|||
/** |
|||
* Remove a tag from this DocBlock. |
|||
* |
|||
* @param Tag $tagToRemove The tag to remove. |
|||
*/ |
|||
public function removeTag(Tag $tagToRemove) : void |
|||
{ |
|||
foreach ($this->tags as $key => $tag) { |
|||
if ($tag === $tagToRemove) { |
|||
unset($this->tags[$key]); |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Adds a tag to this DocBlock. |
|||
* |
|||
* @param Tag $tag The tag to add. |
|||
*/ |
|||
private function addTag(Tag $tag) : void |
|||
{ |
|||
$this->tags[] = $tag; |
|||
} |
|||
} |
@ -0,0 +1,114 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* This file is part of phpDocumentor. |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
* |
|||
* @link http://phpdoc.org |
|||
*/ |
|||
|
|||
namespace phpDocumentor\Reflection\DocBlock; |
|||
|
|||
use phpDocumentor\Reflection\DocBlock\Tags\Formatter; |
|||
use phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter; |
|||
use function vsprintf; |
|||
|
|||
/** |
|||
* Object representing to description for a DocBlock. |
|||
* |
|||
* A Description object can consist of plain text but can also include tags. A Description Formatter can then combine |
|||
* a body template with sprintf-style placeholders together with formatted tags in order to reconstitute a complete |
|||
* description text using the format that you would prefer. |
|||
* |
|||
* Because parsing a Description text can be a verbose process this is handled by the {@see DescriptionFactory}. It is |
|||
* thus recommended to use that to create a Description object, like this: |
|||
* |
|||
* $description = $descriptionFactory->create('This is a {@see Description}', $context); |
|||
* |
|||
* The description factory will interpret the given body and create a body template and list of tags from them, and pass |
|||
* that onto the constructor if this class. |
|||
* |
|||
* > The $context variable is a class of type {@see \phpDocumentor\Reflection\Types\Context} and contains the namespace |
|||
* > and the namespace aliases that apply to this DocBlock. These are used by the Factory to resolve and expand partial |
|||
* > type names and FQSENs. |
|||
* |
|||
* If you do not want to use the DescriptionFactory you can pass a body template and tag listing like this: |
|||
* |
|||
* $description = new Description( |
|||
* 'This is a %1$s', |
|||
* [ new See(new Fqsen('\phpDocumentor\Reflection\DocBlock\Description')) ] |
|||
* ); |
|||
* |
|||
* It is generally recommended to use the Factory as that will also apply escaping rules, while the Description object |
|||
* is mainly responsible for rendering. |
|||
* |
|||
* @see DescriptionFactory to create a new Description. |
|||
* @see Description\Formatter for the formatting of the body and tags. |
|||
*/ |
|||
class Description |
|||
{ |
|||
/** @var string */ |
|||
private $bodyTemplate; |
|||
|
|||
/** @var Tag[] */ |
|||
private $tags; |
|||
|
|||
/** |
|||
* Initializes a Description with its body (template) and a listing of the tags used in the body template. |
|||
* |
|||
* @param Tag[] $tags |
|||
*/ |
|||
public function __construct(string $bodyTemplate, array $tags = []) |
|||
{ |
|||
$this->bodyTemplate = $bodyTemplate; |
|||
$this->tags = $tags; |
|||
} |
|||
|
|||
/** |
|||
* Returns the body template. |
|||
*/ |
|||
public function getBodyTemplate() : string |
|||
{ |
|||
return $this->bodyTemplate; |
|||
} |
|||
|
|||
/** |
|||
* Returns the tags for this DocBlock. |
|||
* |
|||
* @return Tag[] |
|||
*/ |
|||
public function getTags() : array |
|||
{ |
|||
return $this->tags; |
|||
} |
|||
|
|||
/** |
|||
* Renders this description as a string where the provided formatter will format the tags in the expected string |
|||
* format. |
|||
*/ |
|||
public function render(?Formatter $formatter = null) : string |
|||
{ |
|||
if ($formatter === null) { |
|||
$formatter = new PassthroughFormatter(); |
|||
} |
|||
|
|||
$tags = []; |
|||
foreach ($this->tags as $tag) { |
|||
$tags[] = '{' . $formatter->format($tag) . '}'; |
|||
} |
|||
|
|||
return vsprintf($this->bodyTemplate, $tags); |
|||
} |
|||
|
|||
/** |
|||
* Returns a plain string representation of this description. |
|||
*/ |
|||
public function __toString() : string |
|||
{ |
|||
return $this->render(); |
|||
} |
|||
} |
@ -0,0 +1,177 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* This file is part of phpDocumentor. |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
* |
|||
* @link http://phpdoc.org |
|||
*/ |
|||
|
|||
namespace phpDocumentor\Reflection\DocBlock; |
|||
|
|||
use phpDocumentor\Reflection\Types\Context as TypeContext; |
|||
use phpDocumentor\Reflection\Utils; |
|||
use function count; |
|||
use function explode; |
|||
use function implode; |
|||
use function ltrim; |
|||
use function min; |
|||
use function str_replace; |
|||
use function strlen; |
|||
use function strpos; |
|||
use function substr; |
|||
use function trim; |
|||
use const PREG_SPLIT_DELIM_CAPTURE; |
|||
|
|||
/** |
|||
* Creates a new Description object given a body of text. |
|||
* |
|||
* Descriptions in phpDocumentor are somewhat complex entities as they can contain one or more tags inside their |
|||
* body that can be replaced with a readable output. The replacing is done by passing a Formatter object to the |
|||
* Description object's `render` method. |
|||
* |
|||
* In addition to the above does a Description support two types of escape sequences: |
|||
* |
|||
* 1. `{@}` to escape the `@` character to prevent it from being interpreted as part of a tag, i.e. `{{@}link}` |
|||
* 2. `{}` to escape the `}` character, this can be used if you want to use the `}` character in the description |
|||
* of an inline tag. |
|||
* |
|||
* If a body consists of multiple lines then this factory will also remove any superfluous whitespace at the beginning |
|||
* of each line while maintaining any indentation that is used. This will prevent formatting parsers from tripping |
|||
* over unexpected spaces as can be observed with tag descriptions. |
|||
*/ |
|||
class DescriptionFactory |
|||
{ |
|||
/** @var TagFactory */ |
|||
private $tagFactory; |
|||
|
|||
/** |
|||
* Initializes this factory with the means to construct (inline) tags. |
|||
*/ |
|||
public function __construct(TagFactory $tagFactory) |
|||
{ |
|||
$this->tagFactory = $tagFactory; |
|||
} |
|||
|
|||
/** |
|||
* Returns the parsed text of this description. |
|||
*/ |
|||
public function create(string $contents, ?TypeContext $context = null) : Description |
|||
{ |
|||
$tokens = $this->lex($contents); |
|||
$count = count($tokens); |
|||
$tagCount = 0; |
|||
$tags = []; |
|||
|
|||
for ($i = 1; $i < $count; $i += 2) { |
|||
$tags[] = $this->tagFactory->create($tokens[$i], $context); |
|||
$tokens[$i] = '%' . ++$tagCount . '$s'; |
|||
} |
|||
|
|||
//In order to allow "literal" inline tags, the otherwise invalid |
|||
//sequence "{@}" is changed to "@", and "{}" is changed to "}". |
|||
//"%" is escaped to "%%" because of vsprintf. |
|||
//See unit tests for examples. |
|||
for ($i = 0; $i < $count; $i += 2) { |
|||
$tokens[$i] = str_replace(['{@}', '{}', '%'], ['@', '}', '%%'], $tokens[$i]); |
|||
} |
|||
|
|||
return new Description(implode('', $tokens), $tags); |
|||
} |
|||
|
|||
/** |
|||
* Strips the contents from superfluous whitespace and splits the description into a series of tokens. |
|||
* |
|||
* @return string[] A series of tokens of which the description text is composed. |
|||
*/ |
|||
private function lex(string $contents) : array |
|||
{ |
|||
$contents = $this->removeSuperfluousStartingWhitespace($contents); |
|||
|
|||
// performance optimalization; if there is no inline tag, don't bother splitting it up. |
|||
if (strpos($contents, '{@') === false) { |
|||
return [$contents]; |
|||
} |
|||
|
|||
return Utils::pregSplit( |
|||
'/\{ |
|||
# "{@}" is not a valid inline tag. This ensures that we do not treat it as one, but treat it literally. |
|||
(?!@\}) |
|||
# We want to capture the whole tag line, but without the inline tag delimiters. |
|||
(\@ |
|||
# Match everything up to the next delimiter. |
|||
[^{}]* |
|||
# Nested inline tag content should not be captured, or it will appear in the result separately. |
|||
(?: |
|||
# Match nested inline tags. |
|||
(?: |
|||
# Because we did not catch the tag delimiters earlier, we must be explicit with them here. |
|||
# Notice that this also matches "{}", as a way to later introduce it as an escape sequence. |
|||
\{(?1)?\} |
|||
| |
|||
# Make sure we match hanging "{". |
|||
\{ |
|||
) |
|||
# Match content after the nested inline tag. |
|||
[^{}]* |
|||
)* # If there are more inline tags, match them as well. We use "*" since there may not be any |
|||
# nested inline tags. |
|||
) |
|||
\}/Sux', |
|||
$contents, |
|||
0, |
|||
PREG_SPLIT_DELIM_CAPTURE |
|||
); |
|||
} |
|||
|
|||
/** |
|||
* Removes the superfluous from a multi-line description. |
|||
* |
|||
* When a description has more than one line then it can happen that the second and subsequent lines have an |
|||
* additional indentation. This is commonly in use with tags like this: |
|||
* |
|||
* {@}since 1.1.0 This is an example |
|||
* description where we have an |
|||
* indentation in the second and |
|||
* subsequent lines. |
|||
* |
|||
* If we do not normalize the indentation then we have superfluous whitespace on the second and subsequent |
|||
* lines and this may cause rendering issues when, for example, using a Markdown converter. |
|||
*/ |
|||
private function removeSuperfluousStartingWhitespace(string $contents) : string |
|||
{ |
|||
$lines = explode("\n", $contents); |
|||
|
|||
// if there is only one line then we don't have lines with superfluous whitespace and |
|||
// can use the contents as-is |
|||
if (count($lines) <= 1) { |
|||
return $contents; |
|||
} |
|||
|
|||
// determine how many whitespace characters need to be stripped |
|||
$startingSpaceCount = 9999999; |
|||
for ($i = 1, $iMax = count($lines); $i < $iMax; ++$i) { |
|||
// lines with a no length do not count as they are not indented at all |
|||
if (trim($lines[$i]) === '') { |
|||
continue; |
|||
} |
|||
|
|||
// determine the number of prefixing spaces by checking the difference in line length before and after |
|||
// an ltrim |
|||
$startingSpaceCount = min($startingSpaceCount, strlen($lines[$i]) - strlen(ltrim($lines[$i]))); |
|||
} |
|||
|
|||
// strip the number of spaces from each line |
|||
if ($startingSpaceCount > 0) { |
|||
for ($i = 1, $iMax = count($lines); $i < $iMax; ++$i) { |
|||
$lines[$i] = substr($lines[$i], $startingSpaceCount); |
|||
} |
|||
} |
|||
|
|||
return implode("\n", $lines); |
|||
} |
|||
} |
@ -0,0 +1,157 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* This file is part of phpDocumentor. |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
* |
|||
* @link http://phpdoc.org |
|||
*/ |
|||
|
|||
namespace phpDocumentor\Reflection\DocBlock; |
|||
|
|||
use phpDocumentor\Reflection\DocBlock\Tags\Example; |
|||
use function array_slice; |
|||
use function file; |
|||
use function getcwd; |
|||
use function implode; |
|||
use function is_readable; |
|||
use function rtrim; |
|||
use function sprintf; |
|||
use function trim; |
|||
use const DIRECTORY_SEPARATOR; |
|||
|
|||
/** |
|||
* Class used to find an example file's location based on a given ExampleDescriptor. |
|||
*/ |
|||
class ExampleFinder |
|||
{ |
|||
/** @var string */ |
|||
private $sourceDirectory = ''; |
|||
|
|||
/** @var string[] */ |
|||
private $exampleDirectories = []; |
|||
|
|||
/** |
|||
* Attempts to find the example contents for the given descriptor. |
|||
*/ |
|||
public function find(Example $example) : string |
|||
{ |
|||
$filename = $example->getFilePath(); |
|||
|
|||
$file = $this->getExampleFileContents($filename); |
|||
if (!$file) { |
|||
return sprintf('** File not found : %s **', $filename); |
|||
} |
|||
|
|||
return implode('', array_slice($file, $example->getStartingLine() - 1, $example->getLineCount())); |
|||
} |
|||
|
|||
/** |
|||
* Registers the project's root directory where an 'examples' folder can be expected. |
|||
*/ |
|||
public function setSourceDirectory(string $directory = '') : void |
|||
{ |
|||
$this->sourceDirectory = $directory; |
|||
} |
|||
|
|||
/** |
|||
* Returns the project's root directory where an 'examples' folder can be expected. |
|||
*/ |
|||
public function getSourceDirectory() : string |
|||
{ |
|||
return $this->sourceDirectory; |
|||
} |
|||
|
|||
/** |
|||
* Registers a series of directories that may contain examples. |
|||
* |
|||
* @param string[] $directories |
|||
*/ |
|||
public function setExampleDirectories(array $directories) : void |
|||
{ |
|||
$this->exampleDirectories = $directories; |
|||
} |
|||
|
|||
/** |
|||
* Returns a series of directories that may contain examples. |
|||
* |
|||
* @return string[] |
|||
*/ |
|||
public function getExampleDirectories() : array |
|||
{ |
|||
return $this->exampleDirectories; |
|||
} |
|||
|
|||
/** |
|||
* Attempts to find the requested example file and returns its contents or null if no file was found. |
|||
* |
|||
* This method will try several methods in search of the given example file, the first one it encounters is |
|||
* returned: |
|||
* |
|||
* 1. Iterates through all examples folders for the given filename |
|||
* 2. Checks the source folder for the given filename |
|||
* 3. Checks the 'examples' folder in the current working directory for examples |
|||
* 4. Checks the path relative to the current working directory for the given filename |
|||
* |
|||
* @return string[] all lines of the example file |
|||
*/ |
|||
private function getExampleFileContents(string $filename) : ?array |
|||
{ |
|||
$normalizedPath = null; |
|||
|
|||
foreach ($this->exampleDirectories as $directory) { |
|||
$exampleFileFromConfig = $this->constructExamplePath($directory, $filename); |
|||
if (is_readable($exampleFileFromConfig)) { |
|||
$normalizedPath = $exampleFileFromConfig; |
|||
break; |
|||
} |
|||
} |
|||
|
|||
if (!$normalizedPath) { |
|||
if (is_readable($this->getExamplePathFromSource($filename))) { |
|||
$normalizedPath = $this->getExamplePathFromSource($filename); |
|||
} elseif (is_readable($this->getExamplePathFromExampleDirectory($filename))) { |
|||
$normalizedPath = $this->getExamplePathFromExampleDirectory($filename); |
|||
} elseif (is_readable($filename)) { |
|||
$normalizedPath = $filename; |
|||
} |
|||
} |
|||
|
|||
$lines = $normalizedPath && is_readable($normalizedPath) ? file($normalizedPath) : false; |
|||
|
|||
return $lines !== false ? $lines : null; |
|||
} |
|||
|
|||
/** |
|||
* Get example filepath based on the example directory inside your project. |
|||
*/ |
|||
private function getExamplePathFromExampleDirectory(string $file) : string |
|||
{ |
|||
return getcwd() . DIRECTORY_SEPARATOR . 'examples' . DIRECTORY_SEPARATOR . $file; |
|||
} |
|||
|
|||
/** |
|||
* Returns a path to the example file in the given directory.. |
|||
*/ |
|||
private function constructExamplePath(string $directory, string $file) : string |
|||
{ |
|||
return rtrim($directory, '\\/') . DIRECTORY_SEPARATOR . $file; |
|||
} |
|||
|
|||
/** |
|||
* Get example filepath based on sourcecode. |
|||
*/ |
|||
private function getExamplePathFromSource(string $file) : string |
|||
{ |
|||
return sprintf( |
|||
'%s%s%s', |
|||
trim($this->getSourceDirectory(), '\\/'), |
|||
DIRECTORY_SEPARATOR, |
|||
trim($file, '"') |
|||
); |
|||
} |
|||
} |
@ -0,0 +1,151 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* This file is part of phpDocumentor. |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
* |
|||
* @link http://phpdoc.org |
|||
*/ |
|||
|
|||
namespace phpDocumentor\Reflection\DocBlock; |
|||
|
|||
use phpDocumentor\Reflection\DocBlock; |
|||
use phpDocumentor\Reflection\DocBlock\Tags\Formatter; |
|||
use phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter; |
|||
use function sprintf; |
|||
use function str_repeat; |
|||
use function str_replace; |
|||
use function strlen; |
|||
use function wordwrap; |
|||
|
|||
/** |
|||
* Converts a DocBlock back from an object to a complete DocComment including Asterisks. |
|||
*/ |
|||
class Serializer |
|||
{ |
|||
/** @var string The string to indent the comment with. */ |
|||
protected $indentString = ' '; |
|||
|
|||
/** @var int The number of times the indent string is repeated. */ |
|||
protected $indent = 0; |
|||
|
|||
/** @var bool Whether to indent the first line with the given indent amount and string. */ |
|||
protected $isFirstLineIndented = true; |
|||
|
|||
/** @var int|null The max length of a line. */ |
|||
protected $lineLength; |
|||
|
|||
/** @var Formatter A custom tag formatter. */ |
|||
protected $tagFormatter; |
|||
|
|||
/** |
|||
* Create a Serializer instance. |
|||
* |
|||
* @param int $indent The number of times the indent string is repeated. |
|||
* @param string $indentString The string to indent the comment with. |
|||
* @param bool $indentFirstLine Whether to indent the first line. |
|||
* @param int|null $lineLength The max length of a line or NULL to disable line wrapping. |
|||
* @param Formatter $tagFormatter A custom tag formatter, defaults to PassthroughFormatter. |
|||
*/ |
|||
public function __construct( |
|||
int $indent = 0, |
|||
string $indentString = ' ', |
|||
bool $indentFirstLine = true, |
|||
?int $lineLength = null, |
|||
?Formatter $tagFormatter = null |
|||
) { |
|||
$this->indent = $indent; |
|||
$this->indentString = $indentString; |
|||
$this->isFirstLineIndented = $indentFirstLine; |
|||
$this->lineLength = $lineLength; |
|||
$this->tagFormatter = $tagFormatter ?: new PassthroughFormatter(); |
|||
} |
|||
|
|||
/** |
|||
* Generate a DocBlock comment. |
|||
* |
|||
* @param DocBlock $docblock The DocBlock to serialize. |
|||
* |
|||
* @return string The serialized doc block. |
|||
*/ |
|||
public function getDocComment(DocBlock $docblock) : string |
|||
{ |
|||
$indent = str_repeat($this->indentString, $this->indent); |
|||
$firstIndent = $this->isFirstLineIndented ? $indent : ''; |
|||
// 3 === strlen(' * ') |
|||
$wrapLength = $this->lineLength ? $this->lineLength - strlen($indent) - 3 : null; |
|||
|
|||
$text = $this->removeTrailingSpaces( |
|||
$indent, |
|||
$this->addAsterisksForEachLine( |
|||
$indent, |
|||
$this->getSummaryAndDescriptionTextBlock($docblock, $wrapLength) |
|||
) |
|||
); |
|||
|
|||
$comment = $firstIndent . "/**\n"; |
|||
if ($text) { |
|||
$comment .= $indent . ' * ' . $text . "\n"; |
|||
$comment .= $indent . " *\n"; |
|||
} |
|||
|
|||
$comment = $this->addTagBlock($docblock, $wrapLength, $indent, $comment); |
|||
|
|||
return $comment . $indent . ' */'; |
|||
} |
|||
|
|||
private function removeTrailingSpaces(string $indent, string $text) : string |
|||
{ |
|||
return str_replace( |
|||
sprintf("\n%s * \n", $indent), |
|||
sprintf("\n%s *\n", $indent), |
|||
$text |
|||
); |
|||
} |
|||
|
|||
private function addAsterisksForEachLine(string $indent, string $text) : string |
|||
{ |
|||
return str_replace( |
|||
"\n", |
|||
sprintf("\n%s * ", $indent), |
|||
$text |
|||
); |
|||
} |
|||
|
|||
private function getSummaryAndDescriptionTextBlock(DocBlock $docblock, ?int $wrapLength) : string |
|||
{ |
|||
$text = $docblock->getSummary() . ((string) $docblock->getDescription() ? "\n\n" . $docblock->getDescription() |
|||
: ''); |
|||
if ($wrapLength !== null) { |
|||
$text = wordwrap($text, $wrapLength); |
|||
|
|||
return $text; |
|||
} |
|||
|
|||
return $text; |
|||
} |
|||
|
|||
private function addTagBlock(DocBlock $docblock, ?int $wrapLength, string $indent, string $comment) : string |
|||
{ |
|||
foreach ($docblock->getTags() as $tag) { |
|||
$tagText = $this->tagFormatter->format($tag); |
|||
if ($wrapLength !== null) { |
|||
$tagText = wordwrap($tagText, $wrapLength); |
|||
} |
|||
|
|||
$tagText = str_replace( |
|||
"\n", |
|||
sprintf("\n%s * ", $indent), |
|||
$tagText |
|||
); |
|||
|
|||
$comment .= sprintf("%s * %s\n", $indent, $tagText); |
|||
} |
|||
|
|||
return $comment; |
|||
} |
|||
} |
@ -0,0 +1,347 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* This file is part of phpDocumentor. |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
* |
|||
* @link http://phpdoc.org |
|||
*/ |
|||
|
|||
namespace phpDocumentor\Reflection\DocBlock; |
|||
|
|||
use InvalidArgumentException; |
|||
use phpDocumentor\Reflection\DocBlock\Tags\Author; |
|||
use phpDocumentor\Reflection\DocBlock\Tags\Covers; |
|||
use phpDocumentor\Reflection\DocBlock\Tags\Deprecated; |
|||
use phpDocumentor\Reflection\DocBlock\Tags\Generic; |
|||
use phpDocumentor\Reflection\DocBlock\Tags\InvalidTag; |
|||
use phpDocumentor\Reflection\DocBlock\Tags\Link as LinkTag; |
|||
use phpDocumentor\Reflection\DocBlock\Tags\Method; |
|||
use phpDocumentor\Reflection\DocBlock\Tags\Param; |
|||
use phpDocumentor\Reflection\DocBlock\Tags\Property; |
|||
use phpDocumentor\Reflection\DocBlock\Tags\PropertyRead; |
|||
use phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite; |
|||
use phpDocumentor\Reflection\DocBlock\Tags\Return_; |
|||
use phpDocumentor\Reflection\DocBlock\Tags\See as SeeTag; |
|||
use phpDocumentor\Reflection\DocBlock\Tags\Since; |
|||
use phpDocumentor\Reflection\DocBlock\Tags\Source; |
|||
use phpDocumentor\Reflection\DocBlock\Tags\Throws; |
|||
use phpDocumentor\Reflection\DocBlock\Tags\Uses; |
|||
use phpDocumentor\Reflection\DocBlock\Tags\Var_; |
|||
use phpDocumentor\Reflection\DocBlock\Tags\Version; |
|||
use phpDocumentor\Reflection\FqsenResolver; |
|||
use phpDocumentor\Reflection\Types\Context as TypeContext; |
|||
use ReflectionMethod; |
|||
use ReflectionNamedType; |
|||
use ReflectionParameter; |
|||
use Webmozart\Assert\Assert; |
|||
use function array_merge; |
|||
use function array_slice; |
|||
use function call_user_func_array; |
|||
use function count; |
|||
use function get_class; |
|||
use function preg_match; |
|||
use function strpos; |
|||
use function trim; |
|||
|
|||
/** |
|||
* Creates a Tag object given the contents of a tag. |
|||
* |
|||
* This Factory is capable of determining the appropriate class for a tag and instantiate it using its `create` |
|||
* factory method. The `create` factory method of a Tag can have a variable number of arguments; this way you can |
|||
* pass the dependencies that you need to construct a tag object. |
|||
* |
|||
* > Important: each parameter in addition to the body variable for the `create` method must default to null, otherwise |
|||
* > it violates the constraint with the interface; it is recommended to use the {@see Assert::notNull()} method to |
|||
* > verify that a dependency is actually passed. |
|||
* |
|||
* This Factory also features a Service Locator component that is used to pass the right dependencies to the |
|||
* `create` method of a tag; each dependency should be registered as a service or as a parameter. |
|||
* |
|||
* When you want to use a Tag of your own with custom handling you need to call the `registerTagHandler` method, pass |
|||
* the name of the tag and a Fully Qualified Class Name pointing to a class that implements the Tag interface. |
|||
*/ |
|||
final class StandardTagFactory implements TagFactory |
|||
{ |
|||
/** PCRE regular expression matching a tag name. */ |
|||
public const REGEX_TAGNAME = '[\w\-\_\\\\:]+'; |
|||
|
|||
/** |
|||
* @var array<class-string<Tag>> An array with a tag as a key, and an |
|||
* FQCN to a class that handles it as an array value. |
|||
*/ |
|||
private $tagHandlerMappings = [ |
|||
'author' => Author::class, |
|||
'covers' => Covers::class, |
|||
'deprecated' => Deprecated::class, |
|||
// 'example' => '\phpDocumentor\Reflection\DocBlock\Tags\Example', |
|||
'link' => LinkTag::class, |
|||
'method' => Method::class, |
|||
'param' => Param::class, |
|||
'property-read' => PropertyRead::class, |
|||
'property' => Property::class, |
|||
'property-write' => PropertyWrite::class, |
|||
'return' => Return_::class, |
|||
'see' => SeeTag::class, |
|||
'since' => Since::class, |
|||
'source' => Source::class, |
|||
'throw' => Throws::class, |
|||
'throws' => Throws::class, |
|||
'uses' => Uses::class, |
|||
'var' => Var_::class, |
|||
'version' => Version::class, |
|||
]; |
|||
|
|||
/** |
|||
* @var array<class-string<Tag>> An array with a anotation s a key, and an |
|||
* FQCN to a class that handles it as an array value. |
|||
*/ |
|||
private $annotationMappings = []; |
|||
|
|||
/** |
|||
* @var ReflectionParameter[][] a lazy-loading cache containing parameters |
|||
* for each tagHandler that has been used. |
|||
*/ |
|||
private $tagHandlerParameterCache = []; |
|||
|
|||
/** @var FqsenResolver */ |
|||
private $fqsenResolver; |
|||
|
|||
/** |
|||
* @var mixed[] an array representing a simple Service Locator where we can store parameters and |
|||
* services that can be inserted into the Factory Methods of Tag Handlers. |
|||
*/ |
|||
private $serviceLocator = []; |
|||
|
|||
/** |
|||
* Initialize this tag factory with the means to resolve an FQSEN and optionally a list of tag handlers. |
|||
* |
|||
* If no tag handlers are provided than the default list in the {@see self::$tagHandlerMappings} property |
|||
* is used. |
|||
* |
|||
* @see self::registerTagHandler() to add a new tag handler to the existing default list. |
|||
* |
|||
* @param array<class-string<Tag>> $tagHandlers |
|||
*/ |
|||
public function __construct(FqsenResolver $fqsenResolver, ?array $tagHandlers = null) |
|||
{ |
|||
$this->fqsenResolver = $fqsenResolver; |
|||
if ($tagHandlers !== null) { |
|||
$this->tagHandlerMappings = $tagHandlers; |
|||
} |
|||
|
|||
$this->addService($fqsenResolver, FqsenResolver::class); |
|||
} |
|||
|
|||
public function create(string $tagLine, ?TypeContext $context = null) : Tag |
|||
{ |
|||
if (!$context) { |
|||
$context = new TypeContext(''); |
|||
} |
|||
|
|||
[$tagName, $tagBody] = $this->extractTagParts($tagLine); |
|||
|
|||
return $this->createTag(trim($tagBody), $tagName, $context); |
|||
} |
|||
|
|||
/** |
|||
* @param mixed $value |
|||
*/ |
|||
public function addParameter(string $name, $value) : void |
|||
{ |
|||
$this->serviceLocator[$name] = $value; |
|||
} |
|||
|
|||
public function addService(object $service, ?string $alias = null) : void |
|||
{ |
|||
$this->serviceLocator[$alias ?: get_class($service)] = $service; |
|||
} |
|||
|
|||
public function registerTagHandler(string $tagName, string $handler) : void |
|||
{ |
|||
Assert::stringNotEmpty($tagName); |
|||
Assert::classExists($handler); |
|||
Assert::implementsInterface($handler, Tag::class); |
|||
|
|||
if (strpos($tagName, '\\') && $tagName[0] !== '\\') { |
|||
throw new InvalidArgumentException( |
|||
'A namespaced tag must have a leading backslash as it must be fully qualified' |
|||
); |
|||
} |
|||
|
|||
$this->tagHandlerMappings[$tagName] = $handler; |
|||
} |
|||
|
|||
/** |
|||
* Extracts all components for a tag. |
|||
* |
|||
* @return string[] |
|||
*/ |
|||
private function extractTagParts(string $tagLine) : array |
|||
{ |
|||
$matches = []; |
|||
if (!preg_match('/^@(' . self::REGEX_TAGNAME . ')((?:[\s\(\{])\s*([^\s].*)|$)/us', $tagLine, $matches)) { |
|||
throw new InvalidArgumentException( |
|||
'The tag "' . $tagLine . '" does not seem to be wellformed, please check it for errors' |
|||
); |
|||
} |
|||
|
|||
if (count($matches) < 3) { |
|||
$matches[] = ''; |
|||
} |
|||
|
|||
return array_slice($matches, 1); |
|||
} |
|||
|
|||
/** |
|||
* Creates a new tag object with the given name and body or returns null if the tag name was recognized but the |
|||
* body was invalid. |
|||
*/ |
|||
private function createTag(string $body, string $name, TypeContext $context) : Tag |
|||
{ |
|||
$handlerClassName = $this->findHandlerClassName($name, $context); |
|||
$arguments = $this->getArgumentsForParametersFromWiring( |
|||
$this->fetchParametersForHandlerFactoryMethod($handlerClassName), |
|||
$this->getServiceLocatorWithDynamicParameters($context, $name, $body) |
|||
); |
|||
|
|||
try { |
|||
$callable = [$handlerClassName, 'create']; |
|||
Assert::isCallable($callable); |
|||
/** @phpstan-var callable(string): ?Tag $callable */ |
|||
$tag = call_user_func_array($callable, $arguments); |
|||
|
|||
return $tag ?? InvalidTag::create($body, $name); |
|||
} catch (InvalidArgumentException $e) { |
|||
return InvalidTag::create($body, $name)->withError($e); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Determines the Fully Qualified Class Name of the Factory or Tag (containing a Factory Method `create`). |
|||
* |
|||
* @return class-string<Tag> |
|||
*/ |
|||
private function findHandlerClassName(string $tagName, TypeContext $context) : string |
|||
{ |
|||
$handlerClassName = Generic::class; |
|||
if (isset($this->tagHandlerMappings[$tagName])) { |
|||
$handlerClassName = $this->tagHandlerMappings[$tagName]; |
|||
} elseif ($this->isAnnotation($tagName)) { |
|||
// TODO: Annotation support is planned for a later stage and as such is disabled for now |
|||
$tagName = (string) $this->fqsenResolver->resolve($tagName, $context); |
|||
if (isset($this->annotationMappings[$tagName])) { |
|||
$handlerClassName = $this->annotationMappings[$tagName]; |
|||
} |
|||
} |
|||
|
|||
return $handlerClassName; |
|||
} |
|||
|
|||
/** |
|||
* Retrieves the arguments that need to be passed to the Factory Method with the given Parameters. |
|||
* |
|||
* @param ReflectionParameter[] $parameters |
|||
* @param mixed[] $locator |
|||
* |
|||
* @return mixed[] A series of values that can be passed to the Factory Method of the tag whose parameters |
|||
* is provided with this method. |
|||
*/ |
|||
private function getArgumentsForParametersFromWiring(array $parameters, array $locator) : array |
|||
{ |
|||
$arguments = []; |
|||
foreach ($parameters as $parameter) { |
|||
$type = $parameter->getType(); |
|||
$typeHint = null; |
|||
if ($type instanceof ReflectionNamedType) { |
|||
$typeHint = $type->getName(); |
|||
if ($typeHint === 'self') { |
|||
$declaringClass = $parameter->getDeclaringClass(); |
|||
if ($declaringClass !== null) { |
|||
$typeHint = $declaringClass->getName(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
if (isset($locator[$typeHint])) { |
|||
$arguments[] = $locator[$typeHint]; |
|||
continue; |
|||
} |
|||
|
|||
$parameterName = $parameter->getName(); |
|||
if (isset($locator[$parameterName])) { |
|||
$arguments[] = $locator[$parameterName]; |
|||
continue; |
|||
} |
|||
|
|||
$arguments[] = null; |
|||
} |
|||
|
|||
return $arguments; |
|||
} |
|||
|
|||
/** |
|||
* Retrieves a series of ReflectionParameter objects for the static 'create' method of the given |
|||
* tag handler class name. |
|||
* |
|||
* @param class-string $handlerClassName |
|||
* |
|||
* @return ReflectionParameter[] |
|||
*/ |
|||
private function fetchParametersForHandlerFactoryMethod(string $handlerClassName) : array |
|||
{ |
|||
if (!isset($this->tagHandlerParameterCache[$handlerClassName])) { |
|||
$methodReflection = new ReflectionMethod($handlerClassName, 'create'); |
|||
$this->tagHandlerParameterCache[$handlerClassName] = $methodReflection->getParameters(); |
|||
} |
|||
|
|||
return $this->tagHandlerParameterCache[$handlerClassName]; |
|||
} |
|||
|
|||
/** |
|||
* Returns a copy of this class' Service Locator with added dynamic parameters, |
|||
* such as the tag's name, body and Context. |
|||
* |
|||
* @param TypeContext $context The Context (namespace and aliasses) that may be |
|||
* passed and is used to resolve FQSENs. |
|||
* @param string $tagName The name of the tag that may be |
|||
* passed onto the factory method of the Tag class. |
|||
* @param string $tagBody The body of the tag that may be |
|||
* passed onto the factory method of the Tag class. |
|||
* |
|||
* @return mixed[] |
|||
*/ |
|||
private function getServiceLocatorWithDynamicParameters( |
|||
TypeContext $context, |
|||
string $tagName, |
|||
string $tagBody |
|||
) : array { |
|||
return array_merge( |
|||
$this->serviceLocator, |
|||
[ |
|||
'name' => $tagName, |
|||
'body' => $tagBody, |
|||
TypeContext::class => $context, |
|||
] |
|||
); |
|||
} |
|||
|
|||
/** |
|||
* Returns whether the given tag belongs to an annotation. |
|||
* |
|||
* @todo this method should be populated once we implement Annotation notation support. |
|||
*/ |
|||
private function isAnnotation(string $tagContent) : bool |
|||
{ |
|||
// 1. Contains a namespace separator |
|||
// 2. Contains parenthesis |
|||
// 3. Is present in a list of known annotations (make the algorithm smart by first checking is the last part |
|||
// of the annotation class name matches the found tag name |
|||
|
|||
return false; |
|||
} |
|||
} |
@ -0,0 +1,32 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* This file is part of phpDocumentor. |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
* |
|||
* @link http://phpdoc.org |
|||
*/ |
|||
|
|||
namespace phpDocumentor\Reflection\DocBlock; |
|||
|
|||
use phpDocumentor\Reflection\DocBlock\Tags\Formatter; |
|||
|
|||
interface Tag |
|||
{ |
|||
public function getName() : string; |
|||
|
|||
/** |
|||
* @return Tag|mixed Class that implements Tag |
|||
* |
|||
* @phpstan-return ?Tag |
|||
*/ |
|||
public static function create(string $body); |
|||
|
|||
public function render(?Formatter $formatter = null) : string; |
|||
|
|||
public function __toString() : string; |
|||
} |
@ -0,0 +1,84 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* This file is part of phpDocumentor. |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
* |
|||
* @link http://phpdoc.org |
|||
*/ |
|||
|
|||
namespace phpDocumentor\Reflection\DocBlock; |
|||
|
|||
use InvalidArgumentException; |
|||
use phpDocumentor\Reflection\Types\Context as TypeContext; |
|||
|
|||
interface TagFactory |
|||
{ |
|||
/** |
|||
* Adds a parameter to the service locator that can be injected in a tag's factory method. |
|||
* |
|||
* When calling a tag's "create" method we always check the signature for dependencies to inject. One way is to |
|||
* typehint a parameter in the signature so that we can use that interface or class name to inject a dependency |
|||
* (see {@see addService()} for more information on that). |
|||
* |
|||
* Another way is to check the name of the argument against the names in the Service Locator. With this method |
|||
* you can add a variable that will be inserted when a tag's create method is not typehinted and has a matching |
|||
* name. |
|||
* |
|||
* Be aware that there are two reserved names: |
|||
* |
|||
* - name, representing the name of the tag. |
|||
* - body, representing the complete body of the tag. |
|||
* |
|||
* These parameters are injected at the last moment and will override any existing parameter with those names. |
|||
* |
|||
* @param mixed $value |
|||
*/ |
|||
public function addParameter(string $name, $value) : void; |
|||
|
|||
/** |
|||
* Factory method responsible for instantiating the correct sub type. |
|||
* |
|||
* @param string $tagLine The text for this tag, including description. |
|||
* |
|||
* @return Tag A new tag object. |
|||
* |
|||
* @throws InvalidArgumentException If an invalid tag line was presented. |
|||
*/ |
|||
public function create(string $tagLine, ?TypeContext $context = null) : Tag; |
|||
|
|||
/** |
|||
* Registers a service with the Service Locator using the FQCN of the class or the alias, if provided. |
|||
* |
|||
* When calling a tag's "create" method we always check the signature for dependencies to inject. If a parameter |
|||
* has a typehint then the ServiceLocator is queried to see if a Service is registered for that typehint. |
|||
* |
|||
* Because interfaces are regularly used as type-hints this method provides an alias parameter; if the FQCN of the |
|||
* interface is passed as alias then every time that interface is requested the provided service will be returned. |
|||
*/ |
|||
public function addService(object $service) : void; |
|||
|
|||
/** |
|||
* Registers a handler for tags. |
|||
* |
|||
* If you want to use your own tags then you can use this method to instruct the TagFactory |
|||
* to register the name of a tag with the FQCN of a 'Tag Handler'. The Tag handler should implement |
|||
* the {@see Tag} interface (and thus the create method). |
|||
* |
|||
* @param string $tagName Name of tag to register a handler for. When registering a namespaced |
|||
* tag, the full name, along with a prefixing slash MUST be provided. |
|||
* @param class-string<Tag> $handler FQCN of handler. |
|||
* |
|||
* @throws InvalidArgumentException If the tag name is not a string. |
|||
* @throws InvalidArgumentException If the tag name is namespaced (contains backslashes) but |
|||
* does not start with a backslash. |
|||
* @throws InvalidArgumentException If the handler is not a string. |
|||
* @throws InvalidArgumentException If the handler is not an existing class. |
|||
* @throws InvalidArgumentException If the handler does not implement the {@see Tag} interface. |
|||
*/ |
|||
public function registerTagHandler(string $tagName, string $handler) : void; |
|||
} |
@ -0,0 +1,100 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* This file is part of phpDocumentor. |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
* |
|||
* @link http://phpdoc.org |
|||
*/ |
|||
|
|||
namespace phpDocumentor\Reflection\DocBlock\Tags; |
|||
|
|||
use InvalidArgumentException; |
|||
use function filter_var; |
|||
use function preg_match; |
|||
use function trim; |
|||
use const FILTER_VALIDATE_EMAIL; |
|||
|
|||
/** |
|||
* Reflection class for an {@}author tag in a Docblock. |
|||
*/ |
|||
final class Author extends BaseTag implements Factory\StaticMethod |
|||
{ |
|||
/** @var string register that this is the author tag. */ |
|||
protected $name = 'author'; |
|||
|
|||
/** @var string The name of the author */ |
|||
private $authorName; |
|||
|
|||
/** @var string The email of the author */ |
|||
private $authorEmail; |
|||
|
|||
/** |
|||
* Initializes this tag with the author name and e-mail. |
|||
*/ |
|||
public function __construct(string $authorName, string $authorEmail) |
|||
{ |
|||
if ($authorEmail && !filter_var($authorEmail, FILTER_VALIDATE_EMAIL)) { |
|||
throw new InvalidArgumentException('The author tag does not have a valid e-mail address'); |
|||
} |
|||
|
|||
$this->authorName = $authorName; |
|||
$this->authorEmail = $authorEmail; |
|||
} |
|||
|
|||
/** |
|||
* Gets the author's name. |
|||
* |
|||
* @return string The author's name. |
|||
*/ |
|||
public function getAuthorName() : string |
|||
{ |
|||
return $this->authorName; |
|||
} |
|||
|
|||
/** |
|||
* Returns the author's email. |
|||
* |
|||
* @return string The author's email. |
|||
*/ |
|||
public function getEmail() : string |
|||
{ |
|||
return $this->authorEmail; |
|||
} |
|||
|
|||
/** |
|||
* Returns this tag in string form. |
|||
*/ |
|||
public function __toString() : string |
|||
{ |
|||
if ($this->authorEmail) { |
|||
$authorEmail = '<' . $this->authorEmail . '>'; |
|||
} else { |
|||
$authorEmail = ''; |
|||
} |
|||
|
|||
$authorName = (string) $this->authorName; |
|||
|
|||
return $authorName . ($authorEmail !== '' ? ($authorName !== '' ? ' ' : '') . $authorEmail : ''); |
|||
} |
|||
|
|||
/** |
|||
* Attempts to create a new Author object based on †he tag body. |
|||
*/ |
|||
public static function create(string $body) : ?self |
|||
{ |
|||
$splitTagContent = preg_match('/^([^\<]*)(?:\<([^\>]*)\>)?$/u', $body, $matches); |
|||
if (!$splitTagContent) { |
|||
return null; |
|||
} |
|||
|
|||
$authorName = trim($matches[1]); |
|||
$email = isset($matches[2]) ? trim($matches[2]) : ''; |
|||
|
|||
return new static($authorName, $email); |
|||
} |
|||
} |
@ -0,0 +1,53 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* This file is part of phpDocumentor. |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
* |
|||
* @link http://phpdoc.org |
|||
*/ |
|||
|
|||
namespace phpDocumentor\Reflection\DocBlock\Tags; |
|||
|
|||
use phpDocumentor\Reflection\DocBlock; |
|||
use phpDocumentor\Reflection\DocBlock\Description; |
|||
|
|||
/** |
|||
* Parses a tag definition for a DocBlock. |
|||
*/ |
|||
abstract class BaseTag implements DocBlock\Tag |
|||
{ |
|||
/** @var string Name of the tag */ |
|||
protected $name = ''; |
|||
|
|||
/** @var Description|null Description of the tag. */ |
|||
protected $description; |
|||
|
|||
/** |
|||
* Gets the name of this tag. |
|||
* |
|||
* @return string The name of this tag. |
|||
*/ |
|||
public function getName() : string |
|||
{ |
|||
return $this->name; |
|||
} |
|||
|
|||
public function getDescription() : ?Description |
|||
{ |
|||
return $this->description; |
|||
} |
|||
|
|||
public function render(?Formatter $formatter = null) : string |
|||
{ |
|||
if ($formatter === null) { |
|||
$formatter = new Formatter\PassthroughFormatter(); |
|||
} |
|||
|
|||
return $formatter->format($this); |
|||
} |
|||
} |
@ -0,0 +1,100 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* This file is part of phpDocumentor. |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
* |
|||
* @link http://phpdoc.org |
|||
*/ |
|||
|
|||
namespace phpDocumentor\Reflection\DocBlock\Tags; |
|||
|
|||
use phpDocumentor\Reflection\DocBlock\Description; |
|||
use phpDocumentor\Reflection\DocBlock\DescriptionFactory; |
|||
use phpDocumentor\Reflection\Fqsen; |
|||
use phpDocumentor\Reflection\FqsenResolver; |
|||
use phpDocumentor\Reflection\Types\Context as TypeContext; |
|||
use phpDocumentor\Reflection\Utils; |
|||
use Webmozart\Assert\Assert; |
|||
use function array_key_exists; |
|||
use function explode; |
|||
|
|||
/** |
|||
* Reflection class for a @covers tag in a Docblock. |
|||
*/ |
|||
final class Covers extends BaseTag implements Factory\StaticMethod |
|||
{ |
|||
/** @var string */ |
|||
protected $name = 'covers'; |
|||
|
|||
/** @var Fqsen */ |
|||
private $refers; |
|||
|
|||
/** |
|||
* Initializes this tag. |
|||
*/ |
|||
public function __construct(Fqsen $refers, ?Description $description = null) |
|||
{ |
|||
$this->refers = $refers; |
|||
$this->description = $description; |
|||
} |
|||
|
|||
public static function create( |
|||
string $body, |
|||
?DescriptionFactory $descriptionFactory = null, |
|||
?FqsenResolver $resolver = null, |
|||
?TypeContext $context = null |
|||
) : self { |
|||
Assert::stringNotEmpty($body); |
|||
Assert::notNull($descriptionFactory); |
|||
Assert::notNull($resolver); |
|||
|
|||
$parts = Utils::pregSplit('/\s+/Su', $body, 2); |
|||
|
|||
return new static( |
|||
self::resolveFqsen($parts[0], $resolver, $context), |
|||
$descriptionFactory->create($parts[1] ?? '', $context) |
|||
); |
|||
} |
|||
|
|||
private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context) : Fqsen |
|||
{ |
|||
Assert::notNull($fqsenResolver); |
|||
$fqsenParts = explode('::', $parts); |
|||
$resolved = $fqsenResolver->resolve($fqsenParts[0], $context); |
|||
|
|||
if (!array_key_exists(1, $fqsenParts)) { |
|||
return $resolved; |
|||
} |
|||
|
|||
return new Fqsen($resolved . '::' . $fqsenParts[1]); |
|||
} |
|||
|
|||
/** |
|||
* Returns the structural element this tag refers to. |
|||
*/ |
|||
public function getReference() : Fqsen |
|||
{ |
|||
return $this->refers; |
|||
} |
|||
|
|||
/** |
|||
* Returns a string representation of this tag. |
|||
*/ |
|||
public function __toString() : string |
|||
{ |
|||
if ($this->description) { |
|||
$description = $this->description->render(); |
|||
} else { |
|||
$description = ''; |
|||
} |
|||
|
|||
$refers = (string) $this->refers; |
|||
|
|||
return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); |
|||
} |
|||
} |
@ -0,0 +1,108 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* This file is part of phpDocumentor. |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
* |
|||
* @link http://phpdoc.org |
|||
*/ |
|||
|
|||
namespace phpDocumentor\Reflection\DocBlock\Tags; |
|||
|
|||
use phpDocumentor\Reflection\DocBlock\Description; |
|||
use phpDocumentor\Reflection\DocBlock\DescriptionFactory; |
|||
use phpDocumentor\Reflection\Types\Context as TypeContext; |
|||
use Webmozart\Assert\Assert; |
|||
use function preg_match; |
|||
|
|||
/** |
|||
* Reflection class for a {@}deprecated tag in a Docblock. |
|||
*/ |
|||
final class Deprecated extends BaseTag implements Factory\StaticMethod |
|||
{ |
|||
/** @var string */ |
|||
protected $name = 'deprecated'; |
|||
|
|||
/** |
|||
* PCRE regular expression matching a version vector. |
|||
* Assumes the "x" modifier. |
|||
*/ |
|||
public const REGEX_VECTOR = '(?: |
|||
# Normal release vectors. |
|||
\d\S* |
|||
| |
|||
# VCS version vectors. Per PHPCS, they are expected to |
|||
# follow the form of the VCS name, followed by ":", followed |
|||
# by the version vector itself. |
|||
# By convention, popular VCSes like CVS, SVN and GIT use "$" |
|||
# around the actual version vector. |
|||
[^\s\:]+\:\s*\$[^\$]+\$ |
|||
)'; |
|||
|
|||
/** @var string|null The version vector. */ |
|||
private $version; |
|||
|
|||
public function __construct(?string $version = null, ?Description $description = null) |
|||
{ |
|||
Assert::nullOrNotEmpty($version); |
|||
|
|||
$this->version = $version; |
|||
$this->description = $description; |
|||
} |
|||
|
|||
/** |
|||
* @return static |
|||
*/ |
|||
public static function create( |
|||
?string $body, |
|||
?DescriptionFactory $descriptionFactory = null, |
|||
?TypeContext $context = null |
|||
) : self { |
|||
if (empty($body)) { |
|||
return new static(); |
|||
} |
|||
|
|||
$matches = []; |
|||
if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) { |
|||
return new static( |
|||
null, |
|||
$descriptionFactory !== null ? $descriptionFactory->create($body, $context) : null |
|||
); |
|||
} |
|||
|
|||
Assert::notNull($descriptionFactory); |
|||
|
|||
return new static( |
|||
$matches[1], |
|||
$descriptionFactory->create($matches[2] ?? '', $context) |
|||
); |
|||
} |
|||
|
|||
/** |
|||
* Gets the version section of the tag. |
|||
*/ |
|||
public function getVersion() : ?string |
|||
{ |
|||
return $this->version; |
|||
} |
|||
|
|||
/** |
|||
* Returns a string representation for this tag. |
|||
*/ |
|||
public function __toString() : string |
|||
{ |
|||
if ($this->description) { |
|||
$description = $this->description->render(); |
|||
} else { |
|||
$description = ''; |
|||
} |
|||
|
|||
$version = (string) $this->version; |
|||
|
|||
return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); |
|||
} |
|||
} |
@ -0,0 +1,199 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* This file is part of phpDocumentor. |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
* |
|||
* @link http://phpdoc.org |
|||
*/ |
|||
|
|||
namespace phpDocumentor\Reflection\DocBlock\Tags; |
|||
|
|||
use phpDocumentor\Reflection\DocBlock\Tag; |
|||
use Webmozart\Assert\Assert; |
|||
use function array_key_exists; |
|||
use function preg_match; |
|||
use function rawurlencode; |
|||
use function str_replace; |
|||
use function strpos; |
|||
use function trim; |
|||
|
|||
/** |
|||
* Reflection class for a {@}example tag in a Docblock. |
|||
*/ |
|||
final class Example implements Tag, Factory\StaticMethod |
|||
{ |
|||
/** @var string Path to a file to use as an example. May also be an absolute URI. */ |
|||
private $filePath; |
|||
|
|||
/** |
|||
* @var bool Whether the file path component represents an URI. This determines how the file portion |
|||
* appears at {@link getContent()}. |
|||
*/ |
|||
private $isURI; |
|||
|
|||
/** @var int */ |
|||
private $startingLine; |
|||
|
|||
/** @var int */ |
|||
private $lineCount; |
|||
|
|||
/** @var string|null */ |
|||
private $content; |
|||
|
|||
public function __construct( |
|||
string $filePath, |
|||
bool $isURI, |
|||
int $startingLine, |
|||
int $lineCount, |
|||
?string $content |
|||
) { |
|||
Assert::stringNotEmpty($filePath); |
|||
Assert::greaterThanEq($startingLine, 1); |
|||
Assert::greaterThanEq($lineCount, 0); |
|||
|
|||
$this->filePath = $filePath; |
|||
$this->startingLine = $startingLine; |
|||
$this->lineCount = $lineCount; |
|||
if ($content !== null) { |
|||
$this->content = trim($content); |
|||
} |
|||
|
|||
$this->isURI = $isURI; |
|||
} |
|||
|
|||
public function getContent() : string |
|||
{ |
|||
if ($this->content === null || $this->content === '') { |
|||
$filePath = $this->filePath; |
|||
if ($this->isURI) { |
|||
$filePath = $this->isUriRelative($this->filePath) |
|||
? str_replace('%2F', '/', rawurlencode($this->filePath)) |
|||
: $this->filePath; |
|||
} |
|||
|
|||
return trim($filePath); |
|||
} |
|||
|
|||
return $this->content; |
|||
} |
|||
|
|||
public function getDescription() : ?string |
|||
{ |
|||
return $this->content; |
|||
} |
|||
|
|||
public static function create(string $body) : ?Tag |
|||
{ |
|||
// File component: File path in quotes or File URI / Source information |
|||
if (!preg_match('/^\s*(?:(\"[^\"]+\")|(\S+))(?:\s+(.*))?$/sux', $body, $matches)) { |
|||
return null; |
|||
} |
|||
|
|||
$filePath = null; |
|||
$fileUri = null; |
|||
if ($matches[1] !== '') { |
|||
$filePath = $matches[1]; |
|||
} else { |
|||
$fileUri = $matches[2]; |
|||
} |
|||
|
|||
$startingLine = 1; |
|||
$lineCount = 0; |
|||
$description = null; |
|||
|
|||
if (array_key_exists(3, $matches)) { |
|||
$description = $matches[3]; |
|||
|
|||
// Starting line / Number of lines / Description |
|||
if (preg_match('/^([1-9]\d*)(?:\s+((?1))\s*)?(.*)$/sux', $matches[3], $contentMatches)) { |
|||
$startingLine = (int) $contentMatches[1]; |
|||
if (isset($contentMatches[2])) { |
|||
$lineCount = (int) $contentMatches[2]; |
|||
} |
|||
|
|||
if (array_key_exists(3, $contentMatches)) { |
|||
$description = $contentMatches[3]; |
|||
} |
|||
} |
|||
} |
|||
|
|||
return new static( |
|||
$filePath ?? ($fileUri ?? ''), |
|||
$fileUri !== null, |
|||
$startingLine, |
|||
$lineCount, |
|||
$description |
|||
); |
|||
} |
|||
|
|||
/** |
|||
* Returns the file path. |
|||
* |
|||
* @return string Path to a file to use as an example. |
|||
* May also be an absolute URI. |
|||
*/ |
|||
public function getFilePath() : string |
|||
{ |
|||
return trim($this->filePath, '"'); |
|||
} |
|||
|
|||
/** |
|||
* Returns a string representation for this tag. |
|||
*/ |
|||
public function __toString() : string |
|||
{ |
|||
$filePath = (string) $this->filePath; |
|||
$isDefaultLine = $this->startingLine === 1 && $this->lineCount === 0; |
|||
$startingLine = !$isDefaultLine ? (string) $this->startingLine : ''; |
|||
$lineCount = !$isDefaultLine ? (string) $this->lineCount : ''; |
|||
$content = (string) $this->content; |
|||
|
|||
return $filePath |
|||
. ($startingLine !== '' |
|||
? ($filePath !== '' ? ' ' : '') . $startingLine |
|||
: '') |
|||
. ($lineCount !== '' |
|||
? ($filePath !== '' || $startingLine !== '' ? ' ' : '') . $lineCount |
|||
: '') |
|||
. ($content !== '' |
|||
? ($filePath !== '' || $startingLine !== '' || $lineCount !== '' ? ' ' : '') . $content |
|||
: ''); |
|||
} |
|||
|
|||
/** |
|||
* Returns true if the provided URI is relative or contains a complete scheme (and thus is absolute). |
|||
*/ |
|||
private function isUriRelative(string $uri) : bool |
|||
{ |
|||
return strpos($uri, ':') === false; |
|||
} |
|||
|
|||
public function getStartingLine() : int |
|||
{ |
|||
return $this->startingLine; |
|||
} |
|||
|
|||
public function getLineCount() : int |
|||
{ |
|||
return $this->lineCount; |
|||
} |
|||
|
|||
public function getName() : string |
|||
{ |
|||
return 'example'; |
|||
} |
|||
|
|||
public function render(?Formatter $formatter = null) : string |
|||
{ |
|||
if ($formatter === null) { |
|||
$formatter = new Formatter\PassthroughFormatter(); |
|||
} |
|||
|
|||
return $formatter->format($this); |
|||
} |
|||
} |
@ -0,0 +1,25 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* This file is part of phpDocumentor. |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
* |
|||
* @link http://phpdoc.org |
|||
*/ |
|||
|
|||
namespace phpDocumentor\Reflection\DocBlock\Tags\Factory; |
|||
|
|||
/** |
|||
* @deprecated This contract is totally covered by Tag contract. Every class using StaticMethod also use Tag |
|||
*/ |
|||
interface StaticMethod |
|||
{ |
|||
/** |
|||
* @return mixed |
|||
*/ |
|||
public static function create(string $body); |
|||
} |
@ -0,0 +1,24 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* This file is part of phpDocumentor. |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
* |
|||
* @link http://phpdoc.org |
|||
*/ |
|||
|
|||
namespace phpDocumentor\Reflection\DocBlock\Tags; |
|||
|
|||
use phpDocumentor\Reflection\DocBlock\Tag; |
|||
|
|||
interface Formatter |
|||
{ |
|||
/** |
|||
* Formats a tag into a string representation according to a specific format, such as Markdown. |
|||
*/ |
|||
public function format(Tag $tag) : string; |
|||
} |
@ -0,0 +1,49 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* This file is part of phpDocumentor. |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
* |
|||
* @link http://phpdoc.org |
|||
*/ |
|||
|
|||
namespace phpDocumentor\Reflection\DocBlock\Tags\Formatter; |
|||
|
|||
use phpDocumentor\Reflection\DocBlock\Tag; |
|||
use phpDocumentor\Reflection\DocBlock\Tags\Formatter; |
|||
use function max; |
|||
use function str_repeat; |
|||
use function strlen; |
|||
|
|||
class AlignFormatter implements Formatter |
|||
{ |
|||
/** @var int The maximum tag name length. */ |
|||
protected $maxLen = 0; |
|||
|
|||
/** |
|||
* @param Tag[] $tags All tags that should later be aligned with the formatter. |
|||
*/ |
|||
public function __construct(array $tags) |
|||
{ |
|||
foreach ($tags as $tag) { |
|||
$this->maxLen = max($this->maxLen, strlen($tag->getName())); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Formats the given tag to return a simple plain text version. |
|||
*/ |
|||
public function format(Tag $tag) : string |
|||
{ |
|||
return '@' . $tag->getName() . |
|||
str_repeat( |
|||
' ', |
|||
$this->maxLen - strlen($tag->getName()) + 1 |
|||
) . |
|||
$tag; |
|||
} |
|||
} |
@ -0,0 +1,29 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* This file is part of phpDocumentor. |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
* |
|||
* @link http://phpdoc.org |
|||
*/ |
|||
|
|||
namespace phpDocumentor\Reflection\DocBlock\Tags\Formatter; |
|||
|
|||
use phpDocumentor\Reflection\DocBlock\Tag; |
|||
use phpDocumentor\Reflection\DocBlock\Tags\Formatter; |
|||
use function trim; |
|||
|
|||
class PassthroughFormatter implements Formatter |
|||
{ |
|||
/** |
|||
* Formats the given tag to return a simple plain text version. |
|||
*/ |
|||
public function format(Tag $tag) : string |
|||
{ |
|||
return trim('@' . $tag->getName() . ' ' . $tag); |
|||
} |
|||
} |
@ -0,0 +1,88 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* This file is part of phpDocumentor. |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
* |
|||
* @link http://phpdoc.org |
|||
*/ |
|||
|
|||
namespace phpDocumentor\Reflection\DocBlock\Tags; |
|||
|
|||
use InvalidArgumentException; |
|||
use phpDocumentor\Reflection\DocBlock\Description; |
|||
use phpDocumentor\Reflection\DocBlock\DescriptionFactory; |
|||
use phpDocumentor\Reflection\DocBlock\StandardTagFactory; |
|||
use phpDocumentor\Reflection\Types\Context as TypeContext; |
|||
use Webmozart\Assert\Assert; |
|||
use function preg_match; |
|||
|
|||
/** |
|||
* Parses a tag definition for a DocBlock. |
|||
*/ |
|||
final class Generic extends BaseTag implements Factory\StaticMethod |
|||
{ |
|||
/** |
|||
* Parses a tag and populates the member variables. |
|||
* |
|||
* @param string $name Name of the tag. |
|||
* @param Description $description The contents of the given tag. |
|||
*/ |
|||
public function __construct(string $name, ?Description $description = null) |
|||
{ |
|||
$this->validateTagName($name); |
|||
|
|||
$this->name = $name; |
|||
$this->description = $description; |
|||
} |
|||
|
|||
/** |
|||
* Creates a new tag that represents any unknown tag type. |
|||
* |
|||
* @return static |
|||
*/ |
|||
public static function create( |
|||
string $body, |
|||
string $name = '', |
|||
?DescriptionFactory $descriptionFactory = null, |
|||
?TypeContext $context = null |
|||
) : self { |
|||
Assert::stringNotEmpty($name); |
|||
Assert::notNull($descriptionFactory); |
|||
|
|||
$description = $body !== '' ? $descriptionFactory->create($body, $context) : null; |
|||
|
|||
return new static($name, $description); |
|||
} |
|||
|
|||
/** |
|||
* Returns the tag as a serialized string |
|||
*/ |
|||
public function __toString() : string |
|||
{ |
|||
if ($this->description) { |
|||
$description = $this->description->render(); |
|||
} else { |
|||
$description = ''; |
|||
} |
|||
|
|||
return $description; |
|||
} |
|||
|
|||
/** |
|||
* Validates if the tag name matches the expected format, otherwise throws an exception. |
|||
*/ |
|||
private function validateTagName(string $name) : void |
|||
{ |
|||
if (!preg_match('/^' . StandardTagFactory::REGEX_TAGNAME . '$/u', $name)) { |
|||
throw new InvalidArgumentException( |
|||
'The tag name "' . $name . '" is not wellformed. Tags may only consist of letters, underscores, ' |
|||
. 'hyphens and backslashes.' |
|||
); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,144 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
namespace phpDocumentor\Reflection\DocBlock\Tags; |
|||
|
|||
use Closure; |
|||
use Exception; |
|||
use phpDocumentor\Reflection\DocBlock\Tag; |
|||
use ReflectionClass; |
|||
use ReflectionException; |
|||
use ReflectionFunction; |
|||
use Throwable; |
|||
use function array_map; |
|||
use function get_class; |
|||
use function get_resource_type; |
|||
use function is_array; |
|||
use function is_object; |
|||
use function is_resource; |
|||
use function sprintf; |
|||
|
|||
/** |
|||
* This class represents an exception during the tag creation |
|||
* |
|||
* Since the internals of the library are relaying on the correct syntax of a docblock |
|||
* we cannot simply throw exceptions at all time because the exceptions will break the creation of a |
|||
* docklock. Just silently ignore the exceptions is not an option because the user as an issue to fix. |
|||
* |
|||
* This tag holds that error information until a using application is able to display it. The object wil just behave |
|||
* like any normal tag. So the normal application flow will not break. |
|||
*/ |
|||
final class InvalidTag implements Tag |
|||
{ |
|||
/** @var string */ |
|||
private $name; |
|||
|
|||
/** @var string */ |
|||
private $body; |
|||
|
|||
/** @var Throwable|null */ |
|||
private $throwable; |
|||
|
|||
private function __construct(string $name, string $body) |
|||
{ |
|||
$this->name = $name; |
|||
$this->body = $body; |
|||
} |
|||
|
|||
public function getException() : ?Throwable |
|||
{ |
|||
return $this->throwable; |
|||
} |
|||
|
|||
public function getName() : string |
|||
{ |
|||
return $this->name; |
|||
} |
|||
|
|||
public static function create(string $body, string $name = '') : self |
|||
{ |
|||
return new self($name, $body); |
|||
} |
|||
|
|||
public function withError(Throwable $exception) : self |
|||
{ |
|||
$this->flattenExceptionBacktrace($exception); |
|||
$tag = new self($this->name, $this->body); |
|||
$tag->throwable = $exception; |
|||
|
|||
return $tag; |
|||
} |
|||
|
|||
/** |
|||
* Removes all complex types from backtrace |
|||
* |
|||
* Not all objects are serializable. So we need to remove them from the |
|||
* stored exception to be sure that we do not break existing library usage. |
|||
*/ |
|||
private function flattenExceptionBacktrace(Throwable $exception) : void |
|||
{ |
|||
$traceProperty = (new ReflectionClass(Exception::class))->getProperty('trace'); |
|||
$traceProperty->setAccessible(true); |
|||
|
|||
do { |
|||
$trace = $exception->getTrace(); |
|||
if (isset($trace[0]['args'])) { |
|||
$trace = array_map( |
|||
function (array $call) : array { |
|||
$call['args'] = array_map([$this, 'flattenArguments'], $call['args']); |
|||
|
|||
return $call; |
|||
}, |
|||
$trace |
|||
); |
|||
} |
|||
|
|||
$traceProperty->setValue($exception, $trace); |
|||
$exception = $exception->getPrevious(); |
|||
} while ($exception !== null); |
|||
|
|||
$traceProperty->setAccessible(false); |
|||
} |
|||
|
|||
/** |
|||
* @param mixed $value |
|||
* |
|||
* @return mixed |
|||
* |
|||
* @throws ReflectionException |
|||
*/ |
|||
private function flattenArguments($value) |
|||
{ |
|||
if ($value instanceof Closure) { |
|||
$closureReflection = new ReflectionFunction($value); |
|||
$value = sprintf( |
|||
'(Closure at %s:%s)', |
|||
$closureReflection->getFileName(), |
|||
$closureReflection->getStartLine() |
|||
); |
|||
} elseif (is_object($value)) { |
|||
$value = sprintf('object(%s)', get_class($value)); |
|||
} elseif (is_resource($value)) { |
|||
$value = sprintf('resource(%s)', get_resource_type($value)); |
|||
} elseif (is_array($value)) { |
|||
$value = array_map([$this, 'flattenArguments'], $value); |
|||
} |
|||
|
|||
return $value; |
|||
} |
|||
|
|||
public function render(?Formatter $formatter = null) : string |
|||
{ |
|||
if ($formatter === null) { |
|||
$formatter = new Formatter\PassthroughFormatter(); |
|||
} |
|||
|
|||
return $formatter->format($this); |
|||
} |
|||
|
|||
public function __toString() : string |
|||
{ |
|||
return $this->body; |
|||
} |
|||
} |
@ -0,0 +1,78 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
|
|||
/** |
|||
* This file is part of phpDocumentor. |
|||
* |
|||
* For the full copyright and license information, please view the LICENSE |
|||
* file that was distributed with this source code. |
|||
* |
|||
* @link http://phpdoc.org |
|||
*/ |
|||
|
|||
namespace phpDocumentor\Reflection\DocBlock\Tags; |
|||
|
|||
use phpDocumentor\Reflection\DocBlock\Description; |
|||
use phpDocumentor\Reflection\DocBlock\DescriptionFactory; |
|||
use phpDocumentor\Reflection\Types\Context as TypeContext; |
|||
use phpDocumentor\Reflection\Utils; |
|||
use Webmozart\Assert\Assert; |
|||
|
|||
/** |
|||
* Reflection class for a {@}link tag in a Docblock. |
|||
*/ |
|||
final class Link extends BaseTag implements Factory\StaticMethod |
|||
{ |
|||
/** @var string */ |
|||
protected $name = 'link'; |
|||
|
|||
/** @var string */ |
|||
private $link; |
|||
|
|||
/** |
|||
* Initializes a link to a URL. |
|||
*/ |
|||
public function __construct(string $link, ?Description $description = null) |
|||
{ |
|||
$this->link = $link; |
|||
$this->description = $description; |
|||
} |
|||
|
|||
public static function create( |
|||
string $body, |
|||
?DescriptionFactory $descriptionFactory = null, |
|||
?TypeContext $context = null |
|||
) : self { |
|||
Assert::notNull($descriptionFactory); |
|||
|
|||
$parts = Utils::pregSplit('/\s+/Su', $body, 2); |
|||
$description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null; |
|||
|
|||
return new static($parts[0], $description); |
|||
} |
|||
|
|||
/** |
|||
* Gets the link |
|||
*/ |
|||
public function getLink() : string |
|||
{ |
|||
return $this->link; |
|||
} |
|||
|
|||
/** |
|||
* Returns a string representation for this tag. |
|||
*/ |
|||
public function __toString() : string |
|||
{ |
|||
if ($this->description) { |
|||
$description = $this->description->render(); |
|||
} else { |
|||
$description = ''; |
|||
} |
|||
|
|||
$link = (string) $this->link; |
|||
|
|||
return $link . ($description !== '' ? ($link !== '' ? ' ' : '') . $description : ''); |
|||
} |
|||
} |
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue