mirror of
https://github.com/torrentpier/torrentpier-lts.git
synced 2025-03-01 15:21:02 +03:00
353 lines
6.5 KiB
PHP
353 lines
6.5 KiB
PHP
<?php
|
|
/**
|
|
* Zend Framework (http://framework.zend.com/)
|
|
*
|
|
* @link http://github.com/zendframework/zf2 for the canonical source repository
|
|
* @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
|
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
|
*/
|
|
|
|
namespace Zend\Code\Scanner;
|
|
|
|
use Zend\Code\NameInformation;
|
|
|
|
class ParameterScanner
|
|
{
|
|
/**
|
|
* @var bool
|
|
*/
|
|
protected $isScanned = false;
|
|
|
|
/**
|
|
* @var null|ClassScanner
|
|
*/
|
|
protected $declaringScannerClass = null;
|
|
|
|
/**
|
|
* @var null|string
|
|
*/
|
|
protected $declaringClass = null;
|
|
|
|
/**
|
|
* @var null|MethodScanner
|
|
*/
|
|
protected $declaringScannerFunction = null;
|
|
|
|
/**
|
|
* @var null|string
|
|
*/
|
|
protected $declaringFunction = null;
|
|
|
|
/**
|
|
* @var null|string
|
|
*/
|
|
protected $defaultValue = null;
|
|
|
|
/**
|
|
* @var null|string
|
|
*/
|
|
protected $class = null;
|
|
|
|
/**
|
|
* @var null|string
|
|
*/
|
|
protected $name = null;
|
|
|
|
/**
|
|
* @var null|int
|
|
*/
|
|
protected $position = null;
|
|
|
|
/**
|
|
* @var bool
|
|
*/
|
|
protected $isArray = false;
|
|
|
|
/**
|
|
* @var bool
|
|
*/
|
|
protected $isDefaultValueAvailable = false;
|
|
|
|
/**
|
|
* @var bool
|
|
*/
|
|
protected $isOptional = false;
|
|
|
|
/**
|
|
* @var bool
|
|
*/
|
|
protected $isPassedByReference = false;
|
|
|
|
/**
|
|
* @var array|null
|
|
*/
|
|
protected $tokens = null;
|
|
|
|
/**
|
|
* @var null|NameInformation
|
|
*/
|
|
protected $nameInformation = null;
|
|
|
|
/**
|
|
* @param array $parameterTokens
|
|
* @param NameInformation $nameInformation
|
|
*/
|
|
public function __construct(array $parameterTokens, NameInformation $nameInformation = null)
|
|
{
|
|
$this->tokens = $parameterTokens;
|
|
$this->nameInformation = $nameInformation;
|
|
}
|
|
|
|
/**
|
|
* Set declaring class
|
|
*
|
|
* @param string $class
|
|
* @return void
|
|
*/
|
|
public function setDeclaringClass($class)
|
|
{
|
|
$this->declaringClass = (string) $class;
|
|
}
|
|
|
|
/**
|
|
* Set declaring scanner class
|
|
*
|
|
* @param ClassScanner $scannerClass
|
|
* @return void
|
|
*/
|
|
public function setDeclaringScannerClass(ClassScanner $scannerClass)
|
|
{
|
|
$this->declaringScannerClass = $scannerClass;
|
|
}
|
|
|
|
/**
|
|
* Set declaring function
|
|
*
|
|
* @param string $function
|
|
* @return void
|
|
*/
|
|
public function setDeclaringFunction($function)
|
|
{
|
|
$this->declaringFunction = $function;
|
|
}
|
|
|
|
/**
|
|
* Set declaring scanner function
|
|
*
|
|
* @param MethodScanner $scannerFunction
|
|
* @return void
|
|
*/
|
|
public function setDeclaringScannerFunction(MethodScanner $scannerFunction)
|
|
{
|
|
$this->declaringScannerFunction = $scannerFunction;
|
|
}
|
|
|
|
/**
|
|
* Set position
|
|
*
|
|
* @param int $position
|
|
* @return void
|
|
*/
|
|
public function setPosition($position)
|
|
{
|
|
$this->position = $position;
|
|
}
|
|
|
|
/**
|
|
* Scan
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function scan()
|
|
{
|
|
if ($this->isScanned) {
|
|
return;
|
|
}
|
|
|
|
$tokens = &$this->tokens;
|
|
|
|
reset($tokens);
|
|
|
|
SCANNER_TOP:
|
|
|
|
$token = current($tokens);
|
|
|
|
if (is_string($token)) {
|
|
// check pass by ref
|
|
if ($token === '&') {
|
|
$this->isPassedByReference = true;
|
|
goto SCANNER_CONTINUE;
|
|
}
|
|
if ($token === '=') {
|
|
$this->isOptional = true;
|
|
$this->isDefaultValueAvailable = true;
|
|
goto SCANNER_CONTINUE;
|
|
}
|
|
} else {
|
|
if ($this->name === null && ($token[0] === T_STRING || $token[0] === T_NS_SEPARATOR)) {
|
|
$this->class .= $token[1];
|
|
goto SCANNER_CONTINUE;
|
|
}
|
|
if ($token[0] === T_VARIABLE) {
|
|
$this->name = ltrim($token[1], '$');
|
|
goto SCANNER_CONTINUE;
|
|
}
|
|
}
|
|
|
|
if ($this->name !== null) {
|
|
$this->defaultValue .= trim((is_string($token)) ? $token : $token[1]);
|
|
}
|
|
|
|
SCANNER_CONTINUE:
|
|
|
|
if (next($this->tokens) === false) {
|
|
goto SCANNER_END;
|
|
}
|
|
goto SCANNER_TOP;
|
|
|
|
SCANNER_END:
|
|
|
|
if ($this->class && $this->nameInformation) {
|
|
$this->class = $this->nameInformation->resolveName($this->class);
|
|
}
|
|
|
|
$this->isScanned = true;
|
|
}
|
|
|
|
/**
|
|
* Get declaring scanner class
|
|
*
|
|
* @return ClassScanner
|
|
*/
|
|
public function getDeclaringScannerClass()
|
|
{
|
|
return $this->declaringScannerClass;
|
|
}
|
|
|
|
/**
|
|
* Get declaring class
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getDeclaringClass()
|
|
{
|
|
return $this->declaringClass;
|
|
}
|
|
|
|
/**
|
|
* Get declaring scanner function
|
|
*
|
|
* @return MethodScanner
|
|
*/
|
|
public function getDeclaringScannerFunction()
|
|
{
|
|
return $this->declaringScannerFunction;
|
|
}
|
|
|
|
/**
|
|
* Get declaring function
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getDeclaringFunction()
|
|
{
|
|
return $this->declaringFunction;
|
|
}
|
|
|
|
/**
|
|
* Get default value
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getDefaultValue()
|
|
{
|
|
$this->scan();
|
|
|
|
return $this->defaultValue;
|
|
}
|
|
|
|
/**
|
|
* Get class
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getClass()
|
|
{
|
|
$this->scan();
|
|
|
|
return $this->class;
|
|
}
|
|
|
|
/**
|
|
* Get name
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getName()
|
|
{
|
|
$this->scan();
|
|
|
|
return $this->name;
|
|
}
|
|
|
|
/**
|
|
* Get position
|
|
*
|
|
* @return int
|
|
*/
|
|
public function getPosition()
|
|
{
|
|
$this->scan();
|
|
|
|
return $this->position;
|
|
}
|
|
|
|
/**
|
|
* Check if is array
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function isArray()
|
|
{
|
|
$this->scan();
|
|
|
|
return $this->isArray;
|
|
}
|
|
|
|
/**
|
|
* Check if default value is available
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function isDefaultValueAvailable()
|
|
{
|
|
$this->scan();
|
|
|
|
return $this->isDefaultValueAvailable;
|
|
}
|
|
|
|
/**
|
|
* Check if is optional
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function isOptional()
|
|
{
|
|
$this->scan();
|
|
|
|
return $this->isOptional;
|
|
}
|
|
|
|
/**
|
|
* Check if is passed by reference
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function isPassedByReference()
|
|
{
|
|
$this->scan();
|
|
|
|
return $this->isPassedByReference;
|
|
}
|
|
}
|