/** * {@inheritDoc} */ 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; }