/** * @param string $filepath * @param Parser $parser * @param Context $context */ protected function parserFile($filepath, Parser $parser, Context $context) { $context->setFilepath($filepath); $astTraverser = new \PhpParser\NodeTraverser(); $astTraverser->addVisitor(new \PhpParser\NodeVisitor\NameResolver()); try { if (!is_readable($filepath)) { throw new RuntimeException('File ' . $filepath . ' is not readable'); } $context->debug('<comment>Precompile: ' . $filepath . '.</comment>'); $code = file_get_contents($filepath); $astTree = $parser->parse($code); $astTraverser->traverse($astTree); $aliasManager = new AliasManager(); $namespace = null; /** * Step 1 Precompile */ foreach ($astTree as $topStatement) { if ($topStatement instanceof Node\Stmt\Namespace_) { /** * Namespace block can be created without NS name */ if ($topStatement->name) { $namespace = $topStatement->name->toString(); $aliasManager->setNamespace($namespace); } if ($topStatement->stmts) { $this->parseTopDefinitions($topStatement->stmts, $aliasManager, $filepath); } } else { $this->parseTopDefinitions($topStatement, $aliasManager, $filepath); } } /** * Another Traverser to handler Analyzer Passe(s) */ $analyzeTraverser = new AstTraverser([new \PHPSA\Node\Visitor\FunctionCall()], $context); $analyzeTraverser->traverse($astTree); $context->clear(); } catch (\PhpParser\Error $e) { $context->sytaxError($e, $filepath); } catch (Exception $e) { $context->output->writeln("<error>{$e->getMessage()}</error>"); } }
/** * @param string $filepath * @param Parser $parser * @param Context $context */ protected function parserFile($filepath, Parser $parser, Context $context) { try { if (!is_readable($filepath)) { throw new RuntimeException('File ' . $filepath . ' is not readable'); } $code = file_get_contents($filepath); $stmts = $parser->parse($code); /** * Step 1 Precompile */ if ($stmts[0] instanceof Node\Stmt\Namespace_) { $stmts = $stmts[0]->stmts; } foreach ($stmts as $st) { if ($st instanceof Node\Stmt\Class_) { $classDefintion = new ClassDefinition($st->name); $classDefintion->setFilepath($filepath); foreach ($st->stmts as $st) { if ($st instanceof Node\Stmt\ClassMethod) { $method = new ClassMethod($st->name, $st->stmts, $st->type, $st); $classDefintion->addMethod($method); } elseif ($st instanceof Node\Stmt\Property) { $classDefintion->addProperty($st); } elseif ($st instanceof Node\Stmt\ClassConst) { $classDefintion->addConst($st); } } $this->classes[] = $classDefintion; } } $context->clear(); } catch (\PhpParser\Error $e) { $context->sytaxError($e, $filepath); } catch (Exception $e) { $context->output->writeln("<error>{$e->getMessage()}</error>"); } }