class SetNode
Represents a set node.
@author Fabien Potencier <fabien@symfony.com>
Hierarchy
- class \Twig\Node\Node implements \Twig\Node\Countable, \Twig\Node\IteratorAggregate
- class \Twig\Node\SetNode extends \Twig\Node\Node implements \Twig\Node\NodeCaptureInterface
Expanded class hierarchy of SetNode
3 files declare their use of SetNode
- ApplyTokenParser.php in vendor/
twig/ twig/ src/ TokenParser/ ApplyTokenParser.php - SandboxNodeVisitor.php in vendor/
twig/ twig/ src/ NodeVisitor/ SandboxNodeVisitor.php - SetTokenParser.php in vendor/
twig/ twig/ src/ TokenParser/ SetTokenParser.php
File
-
vendor/
twig/ twig/ src/ Node/ SetNode.php, line 23
Namespace
Twig\NodeView source
class SetNode extends Node implements NodeCaptureInterface {
public function __construct(bool $capture, Node $names, Node $values, int $lineno) {
/*
* Optimizes the node when capture is used for a large block of text.
*
* {% set foo %}foo{% endset %} is compiled to $context['foo'] = new Twig\Markup("foo");
*/
$safe = false;
if ($capture) {
$safe = true;
// Node::class === get_class($values) should be removed in Twig 4.0
if (($values instanceof Nodes || Node::class === get_class($values)) && !count($values)) {
$values = new ConstantExpression('', $values->getTemplateLine());
$capture = false;
}
elseif ($values instanceof TextNode) {
$values = new ConstantExpression($values->getAttribute('data'), $values->getTemplateLine());
$capture = false;
}
elseif ($values instanceof PrintNode && $values->getNode('expr') instanceof ConstantExpression) {
$values = $values->getNode('expr');
$capture = false;
}
else {
$values = new CaptureNode($values, $values->getTemplateLine());
}
}
parent::__construct([
'names' => $names,
'values' => $values,
], [
'capture' => $capture,
'safe' => $safe,
], $lineno);
}
public function compile(Compiler $compiler) : void {
$compiler->addDebugInfo($this);
if (\count($this->getNode('names')) > 1) {
$compiler->write('[');
foreach ($this->getNode('names') as $idx => $node) {
if ($idx) {
$compiler->raw(', ');
}
$compiler->subcompile($node);
}
$compiler->raw(']');
}
else {
$compiler->subcompile($this->getNode('names'), false);
}
$compiler->raw(' = ');
if ($this->getAttribute('capture')) {
$compiler->subcompile($this->getNode('values'));
}
else {
if (\count($this->getNode('names')) > 1) {
$compiler->write('[');
foreach ($this->getNode('values') as $idx => $value) {
if ($idx) {
$compiler->raw(', ');
}
$compiler->subcompile($value);
}
$compiler->raw(']');
}
else {
if ($this->getAttribute('safe')) {
if ($this->getNode('values') instanceof ConstantExpression) {
if ('' === $this->getNode('values')
->getAttribute('value')) {
$compiler->raw('""');
}
else {
$compiler->raw('new Markup(')
->subcompile($this->getNode('values'))
->raw(', $this->env->getCharset())');
}
}
else {
$compiler->raw("('' === \$tmp = ")
->subcompile($this->getNode('values'))
->raw(") ? '' : new Markup(\$tmp, \$this->env->getCharset())");
}
}
else {
$compiler->subcompile($this->getNode('values'));
}
}
$compiler->raw(';');
}
$compiler->raw("\n");
}
}
Members
Title Sort descending | Modifiers | Object type | Summary | Overriden Title | Overrides |
---|---|---|---|---|---|
Node::$attributeNameDeprecations | private | property | @var array<string, NameDeprecation> | ||
Node::$attributes | protected | property | |||
Node::$lineno | protected | property | |||
Node::$nodeNameDeprecations | private | property | @var array<string, NameDeprecation> | ||
Node::$nodes | protected | property | |||
Node::$sourceContext | private | property | |||
Node::$tag | protected | property | |||
Node::count | public | function | |||
Node::deprecateAttribute | public | function | |||
Node::deprecateNode | public | function | |||
Node::getAttribute | public | function | |||
Node::getIterator | public | function | |||
Node::getNode | public | function | |||
Node::getNodeTag | public | function | |||
Node::getSourceContext | public | function | |||
Node::getTemplateLine | public | function | |||
Node::getTemplateName | public | function | |||
Node::hasAttribute | public | function | |||
Node::hasNode | public | function | |||
Node::removeAttribute | public | function | |||
Node::removeNode | public | function | |||
Node::setAttribute | public | function | |||
Node::setNode | public | function | 1 | ||
Node::setNodeTag | public | function | @internal | ||
Node::setSourceContext | public | function | |||
Node::__toString | public | function | |||
SetNode::compile | public | function | Overrides Node::compile | ||
SetNode::__construct | public | function | Overrides Node::__construct |