public function testAssignmentToBinaryOperatorEquivalent() { foreach ([O\Operators\Assignment::EQUAL, O\Operators\Assignment::EQUAL_REFERENCE] as $operatorThatShouldNotChange) { $assignment = O\Expression::assign(O\Expression::variable(O\Expression::value('foo')), $operatorThatShouldNotChange, O\Expression::variable(O\Expression::value('bar'))); $this->assertSame($assignment, $assignment->toBinaryOperationEquivalent()); } $assignment = O\Expression::assign(O\Expression::variable(O\Expression::value('foo')), O\Operators\Assignment::ADDITION, O\Expression::variable(O\Expression::value('bar'))); $this->assertEquals(O\Expression::assign(O\Expression::variable(O\Expression::value('foo')), O\Operators\Assignment::EQUAL, O\Expression::binaryOperation(O\Expression::variable(O\Expression::value('foo')), O\Operators\Binary::ADDITION, O\Expression::variable(O\Expression::value('bar')))), $assignment->toBinaryOperationEquivalent()); }
private function parseOperatorNode(Node\Expr $node) { $nodeType = str_replace('Expr_', '', $node->getType()); switch (true) { case isset(self::$assignOperatorsMap[$nodeType]): return Expression::assign($this->parseNode($node->var), self::$assignOperatorsMap[$nodeType], $this->parseNode($node->expr)); case $node instanceof Node\Expr\Instanceof_: return Expression::binaryOperation($this->parseNode($node->expr), Operators\Binary::IS_INSTANCE_OF, $this->parseNameNode($node->class)); case isset(self::$binaryOperatorsMap[$nodeType]): return Expression::binaryOperation($this->parseNode($node->left), self::$binaryOperatorsMap[$nodeType], $this->parseNode($node->right)); case isset(self::$unaryOperatorsMap[$nodeType]): return Expression::unaryOperation(self::$unaryOperatorsMap[$nodeType], $this->parseNode(isset($node->expr) ? $node->expr : $node->var)); case isset(self::$castOperatorMap[$nodeType]): return Expression::cast(self::$castOperatorMap[$nodeType], $this->parseNode($node->expr)); default: return null; } }
/** * @dataProvider parsers */ public function testAssignmentOperator() { $this->assertParsedAs([PowerOperators::TYPE, 'assignmentOperator'], [O\Expression::assign(O\Expression::variable(O\Expression::value('i')), O\Operators\Assignment::POWER, O\Expression::value(5))]); }
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 */ private function assertAssignment(callable $function, $assignToName, $operator, $assigmentName) { $this->assertParsedAs($function, [O\Expression::assign(O\Expression::variable(O\Expression::value($assignToName)), $operator, O\Expression::variable(O\Expression::value($assigmentName)))]); }
/** * @dataProvider parsers */ public function testNestedClosures() { $function = function () { return static function &($foo) use($foo, &$bar) { $foo->bar += 5; }; }; $this->assertParsedAs($function, [O\Expression::returnExpression(O\Expression::closure(true, true, [O\Expression::parameter('foo')], [O\Expression::closureUsedVariable('foo'), O\Expression::closureUsedVariable('bar', true)], [O\Expression::assign(O\Expression::field(self::variable('foo'), O\Expression::value('bar')), O\Operators\Assignment::ADDITION, O\Expression::value(5))]))]); }
protected function joinApplyQuery() { return $this->operation([], new Q\Operations\JoinApply(new Q\Common\Join\Options($this->sequenceSource(), false, new Q\Common\Join\Filter\Custom(new Q\Functions\ConnectorProjection($this->parameter(), self::SCOPE_TYPE, self::SCOPE_NAMESPACE, [$this->parameter() => 'this'], [], [O\Expression::returnExpression(O\Expression::constant('true'))]))), new Q\Functions\ConnectorMutator($this->parameter(), self::SCOPE_TYPE, self::SCOPE_NAMESPACE, [$this->parameter() => 'this'], [O\Expression::parameter('o', null, null, true), O\Expression::parameter('i')], [O\Expression::assign(O\Expression::variable(O\Expression::value('o')), O\Operators\Assignment::MULTIPLICATION, O\Expression::variable(O\Expression::value('i')))]))); }