Skip to content

Commit

Permalink
feat: add class node visitor
Browse files Browse the repository at this point in the history
  • Loading branch information
yusuftaufiq committed Apr 19, 2022
1 parent 831ffdd commit 3bb3d0f
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 7 deletions.
20 changes: 13 additions & 7 deletions src/Parsers/CoreFileParser.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,44 +3,50 @@
namespace Haemanthus\CodeIgniter3IdeHelper\Parsers;

use Haemanthus\CodeIgniter3IdeHelper\Casts\NodeLibraryCast;
use Haemanthus\CodeIgniter3IdeHelper\Objects\PropertyTagDTO;
use Haemanthus\CodeIgniter3IdeHelper\Visitors\ClassNodeVisitor;
use Haemanthus\CodeIgniter3IdeHelper\Visitors\MethodCallNodeVisitor;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\NodeTraverser;
use PhpParser\ParserFactory;

class CoreFileParser extends AbstractFileParser
{
protected MethodCallNodeVisitor $visitor;
protected ClassNodeVisitor $classVisitor;

protected MethodCallNodeVisitor $methodCallVisitor;

protected NodeLibraryCast $libraryCast;

public function __construct(
ParserFactory $parser,
NodeTraverser $traverser,
MethodCallNodeVisitor $visitor,
ClassNodeVisitor $classVisitor,
MethodCallNodeVisitor $methodCallVisitor,
NodeLibraryCast $libraryCast
) {
parent::__construct($parser, $traverser);
$this->visitor = $visitor;
$this->traverser->addVisitor($this->visitor);
$this->classVisitor = $classVisitor;
$this->methodCallVisitor = $methodCallVisitor;
$this->libraryCast = $libraryCast;

$this->traverser->addVisitor($this->classVisitor);
$this->traverser->addVisitor($this->methodCallVisitor);
}

public function parse(string $contents): array
{
$this->traverser->traverse($this->parser->parse($contents));

$libraries = array_reduce(
$this->visitor->getFoundLoadLibraryNodes(),
$this->methodCallVisitor->getFoundLoadLibraryNodes(),
fn (array $carry, MethodCall $library): array => array_merge(
$carry,
$this->libraryCast->cast($library),
),
[],
);

$models = $this->visitor->getFoundLoadModelNodes();
$models = $this->methodCallVisitor->getFoundLoadModelNodes();

return array_merge($libraries);
}
Expand Down
27 changes: 27 additions & 0 deletions src/Visitors/ClassNodeVisitor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace Haemanthus\CodeIgniter3IdeHelper\Visitors;

use PhpParser\Node;
use PhpParser\Node\Stmt\Class_;
use PhpParser\NodeVisitorAbstract;

class ClassNodeVisitor extends NodeVisitorAbstract
{
protected ?Class_ $class;

public function enterNode(Node $node)
{
if ($node instanceof Class_) {
$this->class = clone $node;
$this->class->stmts = [];
}

return parent::enterNode($node);
}

public function getFoundClassNode(): ?Class_
{
return $this->class;
}
}

0 comments on commit 3bb3d0f

Please sign in to comment.