/** * Converts the assignment expression with compound assignment operators * to the equivalent assignment and binary operator combination * * <code> * $variable += 5 * </code> * becomes * <code> * $variable = $variable + 5 * </code> * * @return AssignmentExpression */ public function toBinaryOperationEquivalent() { $binaryOperator = Assignment::toBinaryOperator($this->operator); if ($binaryOperator === null) { return $this; } return $this->update($this->assignTo, Assignment::EQUAL, Expression::binaryOperation($this->assignTo, $binaryOperator, $this->assignmentValue)); }
public function visitAssignment(O\AssignmentExpression $expression) { $assignTo = $expression->getAssignTo(); $assignmentValue = $expression->getAssignmentValue(); $this->walk($assignmentValue); $operator = $expression->getOperator(); if ($operator === O\Operators\Assignment::EQUAL) { $this->analysisContext->setExpressionType($assignTo, $this->analysis[$assignmentValue]); $this->analysis[$expression] = $this->analysis[$assignmentValue]; } elseif ($operator === O\Operators\Assignment::EQUAL_REFERENCE) { $this->analysisContext->removeExpressionType($assignTo); $this->analysisContext->setExpressionType($assignTo, $this->analysis[$assignmentValue]); $this->analysisContext->createReference($assignTo, $assignmentValue); $this->analysis[$expression] = $this->analysis[$assignmentValue]; } else { $this->walk($assignTo); $binaryOperation = $this->typeSystem->getBinaryOperation($this->analysis[$assignTo], O\Operators\Assignment::toBinaryOperator($operator), $this->analysis[$assignmentValue]); $this->analysis[$expression] = $binaryOperation->getReturnType(); } }
public function testAssignmentToBinaryOperator() { $this->assertSame(Binary::ADDITION, Assignment::toBinaryOperator(Assignment::ADDITION)); $this->assertSame(Binary::CONCATENATION, Assignment::toBinaryOperator(Assignment::CONCATENATE)); $this->assertSame(null, Assignment::toBinaryOperator(Assignment::EQUAL)); $this->assertSame(null, Assignment::toBinaryOperator(Assignment::EQUAL_REFERENCE)); $this->assertSame(null, Assignment::toBinaryOperator('no-such-operator')); }