public function parseExpressionNode(Node\Expr $node) { switch (true) { case $mappedNode = $this->parseOperatorNode($node): return $mappedNode; case $node instanceof Node\Scalar && ($mappedNode = $this->parseScalarNode($node)): return $mappedNode; case $node instanceof Node\Expr\Variable: return Expression::variable($this->parseNameNode($node->name)); case $node instanceof Node\Expr\Array_: return $this->parseArrayNode($node); case $node instanceof Node\Expr\FuncCall: return $this->parseFunctionCallNode($node); case $node instanceof Node\Expr\New_: return Expression::newExpression($this->parseNameNode($node->class), $this->parseNodes($node->args)); case $node instanceof Node\Expr\MethodCall: return Expression::methodCall($this->parseNode($node->var), $this->parseNameNode($node->name), $this->parseNodes($node->args)); case $node instanceof Node\Expr\PropertyFetch: return Expression::field($this->parseNode($node->var), $this->parseNameNode($node->name)); case $node instanceof Node\Expr\ArrayDimFetch: return Expression::index($this->parseNode($node->var), $node->dim === null ? null : $this->parseNode($node->dim)); case $node instanceof Node\Expr\ConstFetch: return Expression::constant($this->parseAbsoluteName($node->name)); case $node instanceof Node\Expr\ClassConstFetch: return Expression::classConstant($this->parseNameNode($node->class), $node->name); case $node instanceof Node\Expr\StaticCall: return Expression::staticMethodCall($this->parseNameNode($node->class), $this->parseNameNode($node->name), $this->parseNodes($node->args)); case $node instanceof Node\Expr\StaticPropertyFetch: return Expression::staticField($this->parseNameNode($node->class), $this->parseNameNode($node->name)); case $node instanceof Node\Expr\Ternary: return $this->parseTernaryNode($node); case $node instanceof Node\Expr\Closure: return $this->parseClosureNode($node); case $node instanceof Node\Expr\Empty_: return Expression::emptyExpression($this->parseNode($node->expr)); case $node instanceof Node\Expr\Isset_: return Expression::issetExpression($this->parseNodes($node->vars)); default: throw new ASTException('Cannot parse AST with unknown expression node: %s', get_class($node)); } }
/** * @param string $name * @param mixed[] $arguments * * @return O\MethodCallExpression */ protected function newMethod($name, array $arguments = []) { return O\Expression::methodCall($this->expression, O\Expression::value($name), array_map([O\Expression::getType(), 'argument'], array_map([O\Expression::getType(), 'value'], $arguments))); }
public function expressions() { return [[O\Expression::arrayExpression([])], [O\Expression::arrayItem(null, O\Expression::value(0), false)], [O\Expression::assign(O\Expression::value(0), O\Operators\Assignment::EQUAL, O\Expression::value(0))], [O\Expression::binaryOperation(O\Expression::value(0), O\Operators\Binary::ADDITION, O\Expression::value(0))], [O\Expression::unaryOperation(O\Operators\Unary::PLUS, O\Expression::value(0))], [O\Expression::cast(O\Operators\Cast::STRING, O\Expression::value(0))], [O\Expression::closure(false, false, [], [], [])], [O\Expression::closureUsedVariable('var')], [O\Expression::emptyExpression(O\Expression::value(0))], [O\Expression::field(O\Expression::value(0), O\Expression::value(0))], [O\Expression::functionCall(O\Expression::value(0))], [O\Expression::index(O\Expression::value(0), O\Expression::value(0))], [O\Expression::invocation(O\Expression::value(0))], [O\Expression::issetExpression([O\Expression::value(0)])], [O\Expression::unsetExpression([O\Expression::value(0)])], [O\Expression::methodCall(O\Expression::value(0), O\Expression::value(0))], [O\Expression::newExpression(O\Expression::value(0))], [O\Expression::parameter('')], [O\Expression::argument(O\Expression::value(0))], [O\Expression::returnExpression()], [O\Expression::staticMethodCall(O\Expression::value(0), O\Expression::value(0))], [O\Expression::staticField(O\Expression::value(0), O\Expression::value(0))], [O\Expression::ternary(O\Expression::value(0), null, O\Expression::value(0))], [O\Expression::throwExpression(O\Expression::value(0))], [O\Expression::value(0)], [O\Expression::variable(O\Expression::value(0))], [O\Expression::constant('foo')], [O\Expression::classConstant(O\Expression::value(0), 'foo')]]; }
/** * @dataProvider parsers */ public function testMethodCall() { $this->assertParsedAs(function () { $i->method(); }, [O\Expression::methodCall(O\Expression::variable(O\Expression::value('i')), O\Expression::value('method'))]); }
/** * @dataProvider parsers */ public function testThatChainedMethodCalls() { $this->assertReturn(function (\Pinq\ITraversable $traversable) { return $traversable->asArray(); }, O\Expression::methodCall(O\Expression::variable(O\Expression::value('traversable')), O\Expression::value('asArray'))); $this->assertReturn(function (\Pinq\ITraversable $traversable) { return $traversable->where(function ($i) { return $i > 0; })->all(function ($i) { return $i % 2 === 0; }); }, O\Expression::methodCall(O\Expression::methodCall(O\Expression::variable(O\Expression::value('traversable')), O\Expression::value('where'), [O\Expression::argument(O\Expression::closure(false, false, [O\Expression::parameter('i')], [], [O\Expression::returnExpression(O\Expression::binaryOperation(O\Expression::variable(O\Expression::value('i')), O\Operators\Binary::GREATER_THAN, O\Expression::value(0)))]))]), O\Expression::value('all'), [O\Expression::argument(O\Expression::closure(false, false, [O\Expression::parameter('i')], [], [O\Expression::returnExpression(O\Expression::binaryOperation(O\Expression::binaryOperation(O\Expression::variable(O\Expression::value('i')), O\Operators\Binary::MODULUS, O\Expression::value(2)), O\Operators\Binary::IDENTITY, O\Expression::value(0)))]))])); }
public function testRegisteringTypeDataModules() { if ($this->typeSystem instanceof PhpTypeSystem) { $typeDataModule = new TypeDataModule([__CLASS__ => ['methods' => ['assertEquals' => INativeType::TYPE_NULL]]], ['get_defined_functions' => INativeType::TYPE_INT]); $this->assertNotContains($typeDataModule, $this->typeSystem->getTypeDataModules()); $this->typeSystem->registerTypeDataModule($typeDataModule); $this->assertContains($typeDataModule, $this->typeSystem->getTypeDataModules()); $this->assertEqualsNativeType(INativeType::TYPE_NULL, $this->typeSystem->getObjectType(__CLASS__)->getMethod(O\Expression::methodCall(O\Expression::value($this), O\Expression::value('assertEquals')))->getReturnType()); $this->assertEqualsNativeType(INativeType::TYPE_INT, $this->typeSystem->getFunction('get_defined_functions')->getReturnType()); } }