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(); } }
protected final function visitOffsetSet(O\Expression $expression) { if ($expression instanceof O\MethodCallExpression) { $index = $this->getArgumentValueAt(0, $expression); $value = $this->getArgumentValueAt(1, $expression); $sourceExpression = $expression; } elseif ($expression instanceof O\AssignmentExpression) { $sourceExpression = $expression->getAssignTo(); if ($sourceExpression instanceof O\IndexExpression) { $index = $this->getValue($sourceExpression->getIndex()); $value = $this->getValue($expression->getAssignmentValue()); } else { throw new PinqException('Cannot interpret set index operation: invalid source expression type, expecting %s, %s given', O\IndexExpression::getType(), $expression->getType()); } } else { throw new PinqException('Cannot interpret set index operation: invalid expression type, expecting %s, %s given', O\MethodCallExpression::getType() . ' or ' . O\AssignmentExpression::getType(), $expression->getType()); } $this->interpretation->interpretOffsetSet($this->getId('offset-set'), $this->getId('set-index'), $index, $this->getId('set-value'), $value); $this->interpretSourceAsScope($sourceExpression); }