Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
| Total | |
100.00% |
13 / 13 |
|
100.00% |
1 / 1 |
CRAP | |
100.00% |
1 / 1 |
| ParserClassNode | |
100.00% |
13 / 13 |
|
100.00% |
1 / 1 |
3 | |
100.00% |
1 / 1 |
| parse | |
100.00% |
13 / 13 |
|
100.00% |
1 / 1 |
3 | |||
| 1 | <?php |
| 2 | /** |
| 3 | * @author: Doug Wilbourne (dougwilbourne@gmail.com) |
| 4 | */ |
| 5 | |
| 6 | declare(strict_types=1); |
| 7 | |
| 8 | namespace pvc\parser\php; |
| 9 | |
| 10 | use PhpParser\Node\Stmt\Class_; |
| 11 | use PhpParser\NodeTraverser; |
| 12 | use PhpParser\NodeVisitor\NameResolver; |
| 13 | use PhpParser\ParserFactory; |
| 14 | use pvc\parser\err\NonExistentFilePathException; |
| 15 | use pvc\parser\php\node_visitors\NodeVisitorFirstClass; |
| 16 | |
| 17 | /** |
| 18 | * Parses a file and returns the Class node from the abstract syntax tree generated by the PHP Parser package. |
| 19 | * |
| 20 | * Class ParserClassNode |
| 21 | */ |
| 22 | class ParserClassNode |
| 23 | { |
| 24 | |
| 25 | public function parse(string $fileName) : ?Class_ |
| 26 | { |
| 27 | if (false === ($code = file_get_contents($fileName))) { |
| 28 | throw new NonExistentFilePathException($fileName); |
| 29 | } |
| 30 | $parser = (new ParserFactory())->create(ParserFactory::PREFER_PHP7); |
| 31 | $nodes = $parser->parse($code); |
| 32 | if (empty($nodes)) { |
| 33 | return null; |
| 34 | } |
| 35 | |
| 36 | $traverser = new NodeTraverser(); |
| 37 | $nameResolver = new NameResolver(); |
| 38 | $classVisitor = new NodeVisitorFirstClass(); |
| 39 | $traverser->addVisitor($nameResolver); |
| 40 | $traverser->addVisitor($classVisitor); |
| 41 | $traverser->traverse($nodes); |
| 42 | return $classVisitor->getClassNode(); |
| 43 | } |
| 44 | } |