public function __construct(Twig_Node $node, $name, Twig_Node $arguments = null, $lineno) { if ($node instanceof Twig_Node_Expression_Name) { $node->setAttribute('is_defined_test', true); } elseif ($node instanceof Twig_Node_Expression_GetAttr) { $node->setAttribute('is_defined_test', true); $this->changeIgnoreStrictCheck($node); } elseif ($node instanceof Twig_Node_Expression_Constant || $node instanceof Twig_Node_Expression_Array || $node instanceof Twig_Node_Expression_GetProperty || $node instanceof Twig_Node_Expression_MethodCall) { $node = new Twig_Node_Expression_Constant(true, $node->getLine()); } else { throw new Twig_Error_Syntax('The "defined" test only works with simple variables.', $this->getLine()); } parent::__construct($node, $name, $arguments, $lineno); }
protected function doLeaveNode(\Twig_Node $node, \Twig_Environment $env) { if ($node instanceof WhitespaceCollapse || $node instanceof \Twig_Node_Block || $node instanceof \Twig_Node_AutoEscape) { array_pop($this->statusStack); } elseif ($node instanceof \Twig_Node_BlockReference) { $this->blocks[$node->getAttribute('name')] = $this->needCollapsing(); } elseif ($node instanceof \Twig_Node_Text && $this->needCollapsing()) { $text = $node->getAttribute('data'); if ($this->previousNode instanceof \Twig_Node_Text && ctype_space(substr($this->previousNode->getAttribute('data'), -1))) { $text = ltrim($text); } if ($text === '') { return false; } $node->setAttribute('data', preg_replace(array('/\\s{2,}/', '/<\\s/', '/\\s>/'), array(' ', '<', '>'), $text)); } $this->previousNode = $node; return $node; }
/** * Optimizes "for" tag by removing the "loop" variable creation whenever possible. * * @param Twig_Node $node A Node * @param Twig_Environment $env The current Twig environment */ protected function enterOptimizeFor(Twig_Node $node, Twig_Environment $env) { if ($node instanceof Twig_Node_For) { // disable the loop variable by default $node->setAttribute('with_loop', false); array_unshift($this->loops, $node); array_unshift($this->loopsTargets, $node->getNode('value_target')->getAttribute('name')); array_unshift($this->loopsTargets, $node->getNode('key_target')->getAttribute('name')); } elseif (!$this->loops) { // we are outside a loop return; } elseif ($node instanceof Twig_Node_Expression_Name && 'loop' === $node->getAttribute('name')) { $node->setAttribute('always_defined', true); $this->addLoopToCurrent(); } elseif ($node instanceof Twig_Node_Expression_Name && in_array($node->getAttribute('name'), $this->loopsTargets)) { $node->setAttribute('always_defined', true); } elseif ($node instanceof Twig_Node_BlockReference || $node instanceof Twig_Node_Expression_BlockReference) { $this->addLoopToCurrent(); } elseif ($node instanceof Twig_Node_Include && !$node->getAttribute('only')) { $this->addLoopToAll(); } elseif ($node instanceof Twig_Node_Expression_Function && 'include' === $node->getAttribute('name') && (!$node->getNode('arguments')->hasNode('with_context') || false !== $node->getNode('arguments')->getNode('with_context')->getAttribute('value'))) { $this->addLoopToAll(); } elseif ($node instanceof Twig_Node_Expression_GetAttr && (!$node->getNode('attribute') instanceof Twig_Node_Expression_Constant || 'parent' === $node->getNode('attribute')->getAttribute('value')) && (true === $this->loops[0]->getAttribute('with_loop') || $node->getNode('node') instanceof Twig_Node_Expression_Name && 'loop' === $node->getNode('node')->getAttribute('name'))) { $this->addLoopToAll(); } }
public function enterNode(Twig_Node $node, Twig_Environment $env) { if ($node instanceof Twig_Node_Expression_GetAttr) { $node->setAttribute('disable_c_ext', true); } return $node; }