public function addAssertion(Operand $op, Assertion $assert, $mode = Assertion::MODE_INTERSECTION)
{
$isTemorary = $op instanceof Operand\Temporary;
$isNamed = $isTemorary && $op->original instanceof Operand\Variable && $op->original->name instanceof Operand\Literal;
foreach ($this->assertions as $key => $orig) {
if ($orig['var'] === $op) {
// Merge them
$this->assertions[$key]['assertion'] = new Assertion([$orig['assertion'], $assert], $mode);
return;
}
if (!$isNamed) {
continue;
}
if (!$orig['var'] instanceof Operand\Temporary || !$orig['var']->original instanceof Operand\Variable || !$orig['var']->original->name instanceof Operand\Literal) {
continue;
}
if ($orig['var']->original->name->value === $op->original->name->value) {
// merge
$this->assertions[$key]['assertion'] = new Assertion([$orig['assertion'], $assert], $mode);
return;
}
}
$this->assertions[] = ["var" => $op, "assertion" => $assert];
}