public function compile(Compiler $compiler, OperatorNode $node) { $left = $node->getChild(OperatorNode::OPERAND_LEFT); $keys = [$node->getChild(OperatorNode::OPERAND_RIGHT)]; while ($this->isPropertyAccessOperator($left)) { /** @var $left OperatorNode */ $keys[] = $left->getChild(OperatorNode::OPERAND_RIGHT); $left = $left->getChild(OperatorNode::OPERAND_LEFT); } $arguments = [$left, array_reverse($keys)]; if ($node->hasChild(OperatorNode::OPERAND_MIDDLE)) { $arguments[] = $node->getChild(OperatorNode::OPERAND_MIDDLE); } $compiler->add('$context->' . $this->getMethodName($node))->compileArgumentList($arguments); }
public function compile(Compiler $compiler, OperatorNode $node) { $left = $node->getChild(OperatorNode::OPERAND_LEFT); $compiler->add('('); if ($this->isPropertyAccessOperator($left)) { $root = $left; while ($this->isPropertyAccessOperator($root)) { $root = $root->getChild(OperatorNode::OPERAND_LEFT); } if ($root instanceof VariableNode) { $compiler->add('isset(')->compileNode($root)->add(') &&'); } $left->addData('mode', 'has'); $left->compile($compiler); $compiler->add(' && '); $left->addData('mode', 'get'); $left->compile($compiler); } elseif ($left instanceof VariableNode) { $compiler->add('isset(')->compileNode($left)->add(') && ')->compileNode($left); } elseif ($left instanceof ArrayIndexNode) { $variable = $left->getChild('identifier'); $keys = [$left->getChild('key')]; while ($variable instanceof ArrayIndexNode) { /** @var $right OperatorNode */ $keys[] = $variable->getChild('key'); $variable = $variable->getChild('identifier'); } $arguments = [$variable, array_reverse($keys)]; $compiler->add('isset(')->compileNode($variable)->add(') && $context->hasProperty')->compileArgumentList($arguments)->add(' && $context->getProperty')->compileArgumentList($arguments); } else { $compiler->compileNode($left); } $compiler->add(') ? ('); if ($node->hasChild(OperatorNode::OPERAND_MIDDLE)) { $compiler->compileNode($node->getChild(OperatorNode::OPERAND_MIDDLE)); } else { $compiler->compileNode($node->getChild(OperatorNode::OPERAND_LEFT)); } $compiler->add(') : (')->compileNode($node->getChild(OperatorNode::OPERAND_RIGHT))->add(')'); }