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();
}
}