Skip to content
This repository has been archived by the owner on Dec 6, 2022. It is now read-only.

Commit

Permalink
Add tests for and fix assignment operator to binary operator conversi…
Browse files Browse the repository at this point in the history
…on in expression analyser
  • Loading branch information
Elliot Levin committed Sep 13, 2014
1 parent 834caac commit 14e9e8a
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 1 deletion.
4 changes: 3 additions & 1 deletion Source/Analysis/ExpressionAnalyser.php
Original file line number Diff line number Diff line change
Expand Up @@ -74,17 +74,19 @@ public function visitAssignment(O\AssignmentExpression $expression)
$assignTo = $expression->getAssignTo();
$assignmentValue = $expression->getAssignmentValue();

//$this->walk($assignTo);
$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),
Expand Down
45 changes: 45 additions & 0 deletions Tests/Integration/Analysis/BasicExpressionAnalysisTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,51 @@ function () { '123' / 24; },
}
}

public function testAssignmentOperators()
{
$asserts = [
INativeType::TYPE_INT => [
[function () { $var = 1; }],
[function () { $i %= 1; }, ['i' => $this->typeSystem->getNativeType(INativeType::TYPE_INT)]],
[function () { $i ^= 1; }, ['i' => $this->typeSystem->getNativeType(INativeType::TYPE_INT)]],
[function () { $i &= 1; }, ['i' => $this->typeSystem->getNativeType(INativeType::TYPE_INT)]],
[function () { $i |= 1; }, ['i' => $this->typeSystem->getNativeType(INativeType::TYPE_INT)]],
[function () { $i >>= 1; }, ['i' => $this->typeSystem->getNativeType(INativeType::TYPE_INT)]],
[function () { $i <<= 1; }, ['i' => $this->typeSystem->getNativeType(INativeType::TYPE_INT)]],
[function () { $i += 1; }, ['i' => $this->typeSystem->getNativeType(INativeType::TYPE_INT)]],
[function () { $i -= 1; }, ['i' => $this->typeSystem->getNativeType(INativeType::TYPE_INT)]],
],
INativeType::TYPE_DOUBLE => [
[function ($var) { $i = 3.22; }],
[function () { $i += 1; }, ['i' => $this->typeSystem->getNativeType(INativeType::TYPE_DOUBLE)]],
[function () { $i -= 1; }, ['i' => $this->typeSystem->getNativeType(INativeType::TYPE_DOUBLE)]],
],
INativeType::TYPE_BOOL => [
[function ($var) { $i = true; }],
],
INativeType::TYPE_ARRAY => [
[function () { $i = [1,12]; }],
[function () { $i += [1,12]; }, ['i' => $this->typeSystem->getNativeType(INativeType::TYPE_ARRAY)]],
],
INativeType::TYPE_STRING => [
[function ($var) { $var .= 1; }],
],
INativeType::TYPE_MIXED => [
[function ($var) { $i = $var; }],
[function ($var) { $i =& $var; }],
[function () { $i += 1; }, ['i' => $this->typeSystem->getNativeType(INativeType::TYPE_STRING)]],
[function () { $i -= 1; }, ['i' => $this->typeSystem->getNativeType(INativeType::TYPE_STRING)]],
],
];

foreach($asserts as $expectedType => $expressions)
{
foreach($expressions as $assert) {
$this->assertReturnsNativeType($assert[0], $expectedType, isset($assert[1]) ? $assert[1] : []);
}
}
}

public function testInvalidBinaryOperator()
{
$this->assertAnalysisFails(function () { [] - 3.4; });
Expand Down

0 comments on commit 14e9e8a

Please sign in to comment.