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