Skip to content

Commit

Permalink
feat: add autoload file parser
Browse files Browse the repository at this point in the history
  • Loading branch information
yusuftaufiq committed Apr 21, 2022
1 parent 396a718 commit 8f110da
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 3 deletions.
30 changes: 30 additions & 0 deletions src/Parsers/AutoloadFileParser.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

namespace Haemanthus\CodeIgniter3IdeHelper\Parsers;

use Haemanthus\CodeIgniter3IdeHelper\Visitors\AssignArrayNodeVisitor;
use PhpParser\NodeTraverser;
use PhpParser\ParserFactory;

class AutoloadFileParser extends AbstractFileParser
{
protected AssignArrayNodeVisitor $assignArrayNodeVisitor;

public function __construct(
ParserFactory $parser,
NodeTraverser $traverser
) {
parent::__construct($parser, $traverser);

$this->assignArrayNodeVisitor = new AssignArrayNodeVisitor();
$this->traverser->addVisitor($this->assignArrayNodeVisitor);
}

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

dump($this->assignArrayNodeVisitor->getFoundAutoloadLibraryNodes());
dd($this->assignArrayNodeVisitor->getFoundAutoloadModelNodes());
}
}
17 changes: 14 additions & 3 deletions src/Services/ParserService.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,29 @@
namespace Haemanthus\CodeIgniter3IdeHelper\Services;

use Haemanthus\CodeIgniter3IdeHelper\Factories\CoreFileParserFactory;
use Haemanthus\CodeIgniter3IdeHelper\Parsers\AutoloadFileParser;
use Symfony\Component\Finder\SplFileInfo;

class ParserService
{
public AutoloadFileParser $autoloadParser;

public CoreFileParserFactory $coreParser;

public function __construct(CoreFileParserFactory $coreParser)
{
public function __construct(
AutoloadFileParser $autoloadParser,
CoreFileParserFactory $coreParser
) {
$this->autoloadParser = $autoloadParser;
$this->coreParser = $coreParser;
}

public function parseCoreFiles(array $files)
public function parseAutoloadFile(SplFileInfo $file): array
{
return $this->autoloadParser->parse($file->getContents());
}

public function parseCoreFiles(array $files): array
{
return array_map(fn (SplFileInfo $file) => (
$this->coreParser->create()->parse($file->getContents())
Expand Down
69 changes: 69 additions & 0 deletions src/Visitors/AssignArrayNodeVisitor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
<?php

namespace Haemanthus\CodeIgniter3IdeHelper\Visitors;

use PhpParser\Node;
use PhpParser\NodeTraverser;
use PhpParser\NodeVisitorAbstract;

class AssignArrayNodeVisitor extends NodeVisitorAbstract
{
protected array $libraries = [];

protected array $models = [];

protected function isAssignArrayAutoload(Node $node): bool
{
return $node instanceof Node\Expr\Assign
&& $node->var instanceof Node\Expr\ArrayDimFetch
&& $node->var->var instanceof Node\Expr\Variable
&& $node->var->var->name === 'autoload';
}

protected function isAssignAutoloadLibrary(Node $node): bool
{
return $node instanceof Node\Expr\Assign
&& $node->var instanceof Node\Expr\ArrayDimFetch
&& $node->var->dim instanceof Node\Scalar\String_
&& $node->var->dim->value === 'libraries';
}

protected function isAssignAutoloadModel(Node $node): bool
{
return $node instanceof Node\Expr\Assign
&& $node->var instanceof Node\Expr\ArrayDimFetch
&& $node->var->dim instanceof Node\Scalar\String_
&& $node->var->dim->value === 'models';
}

public function enterNode(Node $node)
{
switch (true) {
case $this->isAssignArrayAutoload($node) === false:
return parent::enterNode($node);

case $this->isAssignAutoloadLibrary($node):
$this->libraries[] = $node;

return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN;

case $this->isAssignAutoloadModel($node):
$this->models[] = $node;

return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN;

default:
return parent::enterNode($node);
}
}

public function getFoundAutoloadLibraryNodes()
{
return $this->libraries;
}

public function getFoundAutoloadModelNodes()
{
return $this->models;
}
}

0 comments on commit 8f110da

Please sign in to comment.