public function walkCompositeExpression(CompositeExpression $expr, AbstractNode $parentNode)
{
switch ($expr->getType()) {
case CompositeExpression::TYPE_AND:
$node = $parentNode->andX();
break;
case CompositeExpression::TYPE_OR:
$node = $parentNode->orX();
break;
default:
throw new \RuntimeException('Unknown composite: ' . $expr->getType());
}
$expressions = $expr->getExpressionList();
$leftExpression = array_shift($expressions);
$this->dispatch($leftExpression, $node);
$parentNode = $node;
foreach ($expressions as $index => $expression) {
if (count($expressions) === $index + 1) {
$this->dispatch($expression, $parentNode);
break;
}
switch ($expr->getType()) {
case CompositeExpression::TYPE_AND:
$parentNode = $parentNode->andX();
break;
case CompositeExpression::TYPE_OR:
$parentNode = $parentNode->orX();
break;
}
$this->dispatch($expression, $parentNode);
}
return $node;
}