/** * Compile function to check it * * @param Context $context * @return bool */ public function compile(Context $context) { if ($this->compiled) { return true; } $context->setFilepath($this->filepath); $this->compiled = true; $context->clearSymbols(); $context->scopePointer = $this->getPointer(); $context->setScope(null); if (count($this->statement->stmts) == 0) { return $context->notice('not-implemented-function', sprintf('Closure %s() is not implemented', $this->name), $this->statement); } if (count($this->statement->params) > 0) { /** @var Node\Param $parameter */ foreach ($this->statement->params as $parameter) { $type = CompiledExpression::UNKNOWN; if ($parameter->type) { if (is_string($parameter->type)) { $type = Types::getType($parameter->type); } elseif ($parameter->type instanceof Node\Name) { $type = CompiledExpression::OBJECT; } } $context->addVariable(new Parameter($parameter->name, null, $type, $parameter->byRef)); } } foreach ($this->statement->stmts as $st) { \PHPSA\nodeVisitorFactory($st, $context); } return true; }
/** * Compile function to check it * * @param Context $context * @return bool */ public function compile(Context $context) { if ($this->compiled) { return true; } $context->setFilepath($this->filepath); $this->compiled = true; $context->scopePointer = $this->getPointer(); $context->setScope(null); $context->getEventManager()->fire(Event\StatementBeforeCompile::EVENT_NAME, new Event\StatementBeforeCompile($this->statement, $context)); if (count($this->statement->params) > 0) { /** @var Node\Param $parameter */ foreach ($this->statement->params as $parameter) { $type = CompiledExpression::UNKNOWN; if ($parameter->type) { if (is_string($parameter->type)) { $type = Types::getType($parameter->type); } elseif ($parameter->type instanceof Node\Name) { $type = CompiledExpression::OBJECT; } } $context->addVariable(new Parameter($parameter->name, null, $type, $parameter->byRef)); } } foreach ($this->statement->stmts as $st) { \PHPSA\nodeVisitorFactory($st, $context); } return true; }
/** * @param string $filepath * @param Context $context * @throws RuntimeException when filepath is not readable */ public function parserFile($filepath, Context $context) { $context->setFilepath($filepath); 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 = $this->parser->parse($code); $this->nodeTraverser->traverse($astTree); $context->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(); $context->aliasManager->setNamespace($namespace); } if ($topStatement->stmts) { $this->parseTopDefinitions($topStatement->stmts, $context->aliasManager, $filepath); } } else { if (is_array($topStatement)) { $this->parseTopDefinitions($topStatement, $context->aliasManager, $filepath); } else { $this->parseTopDefinitions($astTree, $context->aliasManager, $filepath); } } } $context->clear(); } catch (\PhpParser\Error $e) { $context->syntaxError($e, $filepath); } catch (Exception $e) { $context->output->writeln("<error>{$e->getMessage()}</error>"); } }
/** * Compile function to check it * * @param Context $context * @return bool */ public function compile(Context $context) { $context->setFilepath($this->filepath); $this->compiled = true; $context->scopePointer = $this->getPointer(); $context->setScope(null); if (count($this->statement->stmts) == 0) { return $context->notice('not-implemented-function', sprintf('Function %s() is not implemented', $this->name), $this->statement); } if (count($this->statement->params) > 0) { /** @var Node\Param $parameter */ foreach ($this->statement->params as $parameter) { $context->addSymbol($parameter->name); } } foreach ($this->statement->stmts as $st) { \PHPSA\nodeVisitorFactory($st, $context); } return true; }
/** * Compile the definition * * @param Context $context * @return boolean */ public function compile(Context $context) { $context->setFilepath($this->filepath); $context->getEventManager()->fire(Event\StatementBeforeCompile::EVENT_NAME, new Event\StatementBeforeCompile($this->statement, $context)); return true; }
/** * @param Context $context * @return $this */ public function compile(Context $context) { $context->setFilepath($this->filepath); $context->setScope($this); foreach ($this->methods as $method) { $context->clearSymbols(); if (!$method->isStatic()) { $thisPtr = new Variable('this', $this, CompiledExpression::OBJECT); $thisPtr->incGets(); $context->addVariable($thisPtr); } $method->compile($context); $symbols = $context->getSymbols(); if (count($symbols) > 0) { foreach ($symbols as $name => $variable) { if ($variable->isUnused()) { $context->warning('unused-' . $variable->getSymbolType(), sprintf('Unused ' . $variable->getSymbolType() . ' $%s in method %s()', $variable->getName(), $method->getName())); } } } } return $this; }
/** * @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 Context $context * @return $this */ public function compile(Context $context) { if ($this->compiled) { return true; } $this->compiled = true; $context->setFilepath($this->filepath); $context->setScope($this); $context->getEventManager()->fire(Event\StatementBeforeCompile::EVENT_NAME, new Event\StatementBeforeCompile($this->statement, $context)); // Compile event for properties foreach ($this->properties as $property) { if (!$property->default) { continue; } // fire expression event for property default $context->getEventManager()->fire(Event\ExpressionBeforeCompile::EVENT_NAME, new Event\ExpressionBeforeCompile($property->default, $context)); } // Compile event for PropertyProperty foreach ($this->properties as $property) { $context->getEventManager()->fire(Event\StatementBeforeCompile::EVENT_NAME, new Event\StatementBeforeCompile($property, $context)); } // Compile event for constants foreach ($this->constants as $const) { $context->getEventManager()->fire(Event\StatementBeforeCompile::EVENT_NAME, new Event\StatementBeforeCompile($const, $context)); } // Compiler event for property statements foreach ($this->propertyStatements as $prop) { $context->getEventManager()->fire(Event\StatementBeforeCompile::EVENT_NAME, new Event\StatementBeforeCompile($prop, $context)); } // Compile each method foreach ($this->methods as $method) { $context->clearSymbols(); if (!$method->isStatic()) { $thisPtr = new Variable('this', $this, CompiledExpression::OBJECT); $thisPtr->incGets(); $context->addVariable($thisPtr); } $method->compile($context); $symbols = $context->getSymbols(); if (count($symbols) > 0) { foreach ($symbols as $name => $variable) { if ($variable->isUnused()) { $context->warning('unused-' . $variable->getSymbolType(), sprintf('Unused ' . $variable->getSymbolType() . ' $%s in method %s()', $variable->getName(), $method->getName())); } } } } return $this; }