Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
100.00% |
1 / 1 |
|
100.00% |
4 / 4 |
CRAP | |
100.00% |
41 / 41 |
FqcnHelper | |
100.00% |
1 / 1 |
|
100.00% |
4 / 4 |
14 | |
100.00% |
41 / 41 |
beforeTraverse(array $nodes) | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
enterNode(PHPParser_Node $node) | |
100.00% |
1 / 1 |
5 | |
100.00% |
21 / 21 |
|||
resolveClassName(\PHPParser_Node_Name $src) | |
100.00% |
1 / 1 |
6 | |
100.00% |
11 / 11 |
|||
getNamespacedName(PHPParser_Node $node) | |
100.00% |
1 / 1 |
2 | |
100.00% |
6 / 6 |
<?php | |
/* | |
* Mondrian | |
*/ | |
namespace Trismegiste\Mondrian\Visitor; | |
use PHPParser_NodeVisitorAbstract; | |
use PHPParser_Node; | |
use PHPParser_Error; | |
/** | |
* FqcnHelper is an helper for resolving FQCN for Class/Interface/Param | |
*/ | |
class FqcnHelper extends PHPParser_NodeVisitorAbstract | |
{ | |
/** | |
* @var null|PHPParser_Node_Name Current namespace | |
*/ | |
protected $namespace; | |
/** | |
* @var array Currently defined namespace and class aliases | |
*/ | |
protected $aliases; | |
/** | |
* current file | |
*/ | |
protected $currentPhpFile = false; | |
public function beforeTraverse(array $nodes) | |
{ | |
// if the visitor is used without PhpFile nodes | |
$this->namespace = null; | |
$this->aliases = array(); | |
} | |
public function enterNode(PHPParser_Node $node) | |
{ | |
switch ($node->getType()) { | |
case 'PhpFile' : | |
$this->currentPhpFile = $node; | |
// resetting the tracking of namespace and alias if we enter in a new file | |
$this->namespace = null; | |
$this->aliases = array(); | |
break; | |
case 'Stmt_Namespace' : | |
$this->namespace = $node->name; | |
$this->aliases = array(); | |
break; | |
case 'Stmt_UseUse' : | |
if (isset($this->aliases[$node->alias])) { | |
throw new PHPParser_Error( | |
sprintf( | |
'Cannot use "%s" as "%s" because the name is already in use', $node->name, $node->alias | |
), $node->getLine() | |
); | |
} | |
$this->aliases[$node->alias] = $node->name; | |
break; | |
} | |
} | |
/** | |
* resolve the Name with current namespace and alias | |
* | |
* @param \PHPParser_Node_Name $src | |
* @return \PHPParser_Node_Name|\PHPParser_Node_Name_FullyQualified | |
*/ | |
protected function resolveClassName(\PHPParser_Node_Name $src) | |
{ | |
$name = clone $src; | |
// don't resolve special class names | |
if (in_array((string) $name, array('self', 'parent', 'static'))) { | |
return $name; | |
} | |
// fully qualified names are already resolved | |
if ($name->isFullyQualified()) { | |
return $name; | |
} | |
// resolve aliases (for non-relative names) | |
if (!$name->isRelative() && isset($this->aliases[$name->getFirst()])) { | |
$name->setFirst($this->aliases[$name->getFirst()]); | |
// if no alias exists prepend current namespace | |
} elseif (null !== $this->namespace) { | |
$name->prepend($this->namespace); | |
} | |
return new \PHPParser_Node_Name_FullyQualified($name->parts, $name->getAttributes()); | |
} | |
/** | |
* Helper : get the FQCN of the given $node->name | |
* | |
* @param PHPParser_Node $node | |
* @return string | |
*/ | |
protected function getNamespacedName(PHPParser_Node $node) | |
{ | |
if (null !== $this->namespace) { | |
$namespacedName = clone $this->namespace; | |
$namespacedName->append($node->name); | |
} else { | |
$namespacedName = $node->name; | |
} | |
return (string) $namespacedName; | |
} | |
} |