Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
CRAP | |
100.00% |
26 / 26 |
LiskovSearch | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
11 | |
100.00% |
26 / 26 |
createReducedGraph() | |
100.00% |
1 / 1 |
11 | |
100.00% |
26 / 26 |
<?php | |
/* | |
* Mondrian | |
*/ | |
namespace Trismegiste\Mondrian\Analysis; | |
use Trismegiste\Mondrian\Transform\Vertex\ImplVertex; | |
use Trismegiste\Mondrian\Transform\Vertex\MethodVertex; | |
use Trismegiste\Mondrian\Transform\Vertex\ClassVertex; | |
use Trismegiste\Mondrian\Graph\Algorithm; | |
/** | |
* LiskovSearch is an analyser | |
*/ | |
class LiskovSearch extends Algorithm implements Generator | |
{ | |
/** | |
* Generate a digraph reduced to all calls to concrete method | |
*/ | |
public function createReducedGraph() | |
{ | |
$reducedGraph = new \Trismegiste\Mondrian\Graph\Digraph(); | |
$edgeSet = $this->getEdgeSet(); | |
foreach ($this->getVertexSet() as $cls) { | |
if ($cls instanceof ClassVertex) { | |
// for each class | |
foreach ($this->getEdgeIterator($cls) as $methodVertex) { | |
if ($methodVertex instanceof MethodVertex) { | |
// we have a method first declared in a class | |
// we search for calls to that method | |
foreach ($edgeSet as $call) { | |
if (($call->getSource() instanceof ImplVertex) | |
&& ($call->getTarget() === $methodVertex)) { | |
$impl = $call->getSource(); | |
preg_match('#^([^:]+)::#', $impl->getName(), $extract); | |
$owningClass = $extract[1]; | |
// we search for the owning class of that impl | |
foreach ($this->getSuccessor($impl) as $succ) { | |
if (($succ instanceof ClassVertex) | |
&& ($succ->getName() == $owningClass )) { | |
// we found the owning class vertex of $impl | |
// add edges to reduced graph | |
$reducedGraph->addEdge($methodVertex, $cls); | |
$reducedGraph->addEdge($succ, $methodVertex); | |
} | |
} | |
} | |
} | |
} | |
} | |
} | |
} // arf | |
return $reducedGraph; | |
} | |
} |