Edit File by line

Deprecated: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in /home/sportsfever/public_html/filemanger/function.php on line 93
/home/sportsfe.../httpdocs/wp-conte.../plugins/sitepres.../lib/twig/src/NodeVisi...
File: OptimizerNodeVisitor.php
<?php
[0] Fix | Delete
[1] Fix | Delete
/*
[2] Fix | Delete
* This file is part of Twig.
[3] Fix | Delete
*
[4] Fix | Delete
* (c) Fabien Potencier
[5] Fix | Delete
*
[6] Fix | Delete
* For the full copyright and license information, please view the LICENSE
[7] Fix | Delete
* file that was distributed with this source code.
[8] Fix | Delete
*/
[9] Fix | Delete
namespace WPML\Core\Twig\NodeVisitor;
[10] Fix | Delete
[11] Fix | Delete
use WPML\Core\Twig\Environment;
[12] Fix | Delete
use WPML\Core\Twig\Node\BlockReferenceNode;
[13] Fix | Delete
use WPML\Core\Twig\Node\BodyNode;
[14] Fix | Delete
use WPML\Core\Twig\Node\Expression\AbstractExpression;
[15] Fix | Delete
use WPML\Core\Twig\Node\Expression\BlockReferenceExpression;
[16] Fix | Delete
use WPML\Core\Twig\Node\Expression\ConstantExpression;
[17] Fix | Delete
use WPML\Core\Twig\Node\Expression\FilterExpression;
[18] Fix | Delete
use WPML\Core\Twig\Node\Expression\FunctionExpression;
[19] Fix | Delete
use WPML\Core\Twig\Node\Expression\GetAttrExpression;
[20] Fix | Delete
use WPML\Core\Twig\Node\Expression\NameExpression;
[21] Fix | Delete
use WPML\Core\Twig\Node\Expression\ParentExpression;
[22] Fix | Delete
use WPML\Core\Twig\Node\Expression\TempNameExpression;
[23] Fix | Delete
use WPML\Core\Twig\Node\ForNode;
[24] Fix | Delete
use WPML\Core\Twig\Node\IncludeNode;
[25] Fix | Delete
use WPML\Core\Twig\Node\Node;
[26] Fix | Delete
use WPML\Core\Twig\Node\PrintNode;
[27] Fix | Delete
use WPML\Core\Twig\Node\SetTempNode;
[28] Fix | Delete
/**
[29] Fix | Delete
* Tries to optimize the AST.
[30] Fix | Delete
*
[31] Fix | Delete
* This visitor is always the last registered one.
[32] Fix | Delete
*
[33] Fix | Delete
* You can configure which optimizations you want to activate via the
[34] Fix | Delete
* optimizer mode.
[35] Fix | Delete
*
[36] Fix | Delete
* @final
[37] Fix | Delete
*
[38] Fix | Delete
* @author Fabien Potencier <fabien@symfony.com>
[39] Fix | Delete
*/
[40] Fix | Delete
class OptimizerNodeVisitor extends \WPML\Core\Twig\NodeVisitor\AbstractNodeVisitor
[41] Fix | Delete
{
[42] Fix | Delete
const OPTIMIZE_ALL = -1;
[43] Fix | Delete
const OPTIMIZE_NONE = 0;
[44] Fix | Delete
const OPTIMIZE_FOR = 2;
[45] Fix | Delete
const OPTIMIZE_RAW_FILTER = 4;
[46] Fix | Delete
const OPTIMIZE_VAR_ACCESS = 8;
[47] Fix | Delete
protected $loops = [];
[48] Fix | Delete
protected $loopsTargets = [];
[49] Fix | Delete
protected $optimizers;
[50] Fix | Delete
protected $prependedNodes = [];
[51] Fix | Delete
protected $inABody = \false;
[52] Fix | Delete
/**
[53] Fix | Delete
* @param int $optimizers The optimizer mode
[54] Fix | Delete
*/
[55] Fix | Delete
public function __construct($optimizers = -1)
[56] Fix | Delete
{
[57] Fix | Delete
if (!\is_int($optimizers) || $optimizers > (self::OPTIMIZE_FOR | self::OPTIMIZE_RAW_FILTER | self::OPTIMIZE_VAR_ACCESS)) {
[58] Fix | Delete
throw new \InvalidArgumentException(\sprintf('Optimizer mode "%s" is not valid.', $optimizers));
[59] Fix | Delete
}
[60] Fix | Delete
$this->optimizers = $optimizers;
[61] Fix | Delete
}
[62] Fix | Delete
protected function doEnterNode(\WPML\Core\Twig\Node\Node $node, \WPML\Core\Twig\Environment $env)
[63] Fix | Delete
{
[64] Fix | Delete
if (self::OPTIMIZE_FOR === (self::OPTIMIZE_FOR & $this->optimizers)) {
[65] Fix | Delete
$this->enterOptimizeFor($node, $env);
[66] Fix | Delete
}
[67] Fix | Delete
if (\PHP_VERSION_ID < 50400 && self::OPTIMIZE_VAR_ACCESS === (self::OPTIMIZE_VAR_ACCESS & $this->optimizers) && !$env->isStrictVariables() && !$env->hasExtension('WPML\\Core\\Twig\\Extension\\SandboxExtension')) {
[68] Fix | Delete
if ($this->inABody) {
[69] Fix | Delete
if (!$node instanceof \WPML\Core\Twig\Node\Expression\AbstractExpression) {
[70] Fix | Delete
if ('Twig_Node' !== \get_class($node)) {
[71] Fix | Delete
\array_unshift($this->prependedNodes, []);
[72] Fix | Delete
}
[73] Fix | Delete
} else {
[74] Fix | Delete
$node = $this->optimizeVariables($node, $env);
[75] Fix | Delete
}
[76] Fix | Delete
} elseif ($node instanceof \WPML\Core\Twig\Node\BodyNode) {
[77] Fix | Delete
$this->inABody = \true;
[78] Fix | Delete
}
[79] Fix | Delete
}
[80] Fix | Delete
return $node;
[81] Fix | Delete
}
[82] Fix | Delete
protected function doLeaveNode(\WPML\Core\Twig\Node\Node $node, \WPML\Core\Twig\Environment $env)
[83] Fix | Delete
{
[84] Fix | Delete
$expression = $node instanceof \WPML\Core\Twig\Node\Expression\AbstractExpression;
[85] Fix | Delete
if (self::OPTIMIZE_FOR === (self::OPTIMIZE_FOR & $this->optimizers)) {
[86] Fix | Delete
$this->leaveOptimizeFor($node, $env);
[87] Fix | Delete
}
[88] Fix | Delete
if (self::OPTIMIZE_RAW_FILTER === (self::OPTIMIZE_RAW_FILTER & $this->optimizers)) {
[89] Fix | Delete
$node = $this->optimizeRawFilter($node, $env);
[90] Fix | Delete
}
[91] Fix | Delete
$node = $this->optimizePrintNode($node, $env);
[92] Fix | Delete
if (self::OPTIMIZE_VAR_ACCESS === (self::OPTIMIZE_VAR_ACCESS & $this->optimizers) && !$env->isStrictVariables() && !$env->hasExtension('WPML\\Core\\Twig\\Extension\\SandboxExtension')) {
[93] Fix | Delete
if ($node instanceof \WPML\Core\Twig\Node\BodyNode) {
[94] Fix | Delete
$this->inABody = \false;
[95] Fix | Delete
} elseif ($this->inABody) {
[96] Fix | Delete
if (!$expression && 'Twig_Node' !== \get_class($node) && ($prependedNodes = \array_shift($this->prependedNodes))) {
[97] Fix | Delete
$nodes = [];
[98] Fix | Delete
foreach (\array_unique($prependedNodes) as $name) {
[99] Fix | Delete
$nodes[] = new \WPML\Core\Twig\Node\SetTempNode($name, $node->getTemplateLine());
[100] Fix | Delete
}
[101] Fix | Delete
$nodes[] = $node;
[102] Fix | Delete
$node = new \WPML\Core\Twig\Node\Node($nodes);
[103] Fix | Delete
}
[104] Fix | Delete
}
[105] Fix | Delete
}
[106] Fix | Delete
return $node;
[107] Fix | Delete
}
[108] Fix | Delete
protected function optimizeVariables(\WPML\Core\Twig_NodeInterface $node, \WPML\Core\Twig\Environment $env)
[109] Fix | Delete
{
[110] Fix | Delete
if ('Twig_Node_Expression_Name' === \get_class($node) && $node->isSimple()) {
[111] Fix | Delete
$this->prependedNodes[0][] = $node->getAttribute('name');
[112] Fix | Delete
return new \WPML\Core\Twig\Node\Expression\TempNameExpression($node->getAttribute('name'), $node->getTemplateLine());
[113] Fix | Delete
}
[114] Fix | Delete
return $node;
[115] Fix | Delete
}
[116] Fix | Delete
/**
[117] Fix | Delete
* Optimizes print nodes.
[118] Fix | Delete
*
[119] Fix | Delete
* It replaces:
[120] Fix | Delete
*
[121] Fix | Delete
* * "echo $this->render(Parent)Block()" with "$this->display(Parent)Block()"
[122] Fix | Delete
*
[123] Fix | Delete
* @return \Twig_NodeInterface
[124] Fix | Delete
*/
[125] Fix | Delete
protected function optimizePrintNode(\WPML\Core\Twig_NodeInterface $node, \WPML\Core\Twig\Environment $env)
[126] Fix | Delete
{
[127] Fix | Delete
if (!$node instanceof \WPML\Core\Twig\Node\PrintNode) {
[128] Fix | Delete
return $node;
[129] Fix | Delete
}
[130] Fix | Delete
$exprNode = $node->getNode('expr');
[131] Fix | Delete
if ($exprNode instanceof \WPML\Core\Twig\Node\Expression\BlockReferenceExpression || $exprNode instanceof \WPML\Core\Twig\Node\Expression\ParentExpression) {
[132] Fix | Delete
$exprNode->setAttribute('output', \true);
[133] Fix | Delete
return $exprNode;
[134] Fix | Delete
}
[135] Fix | Delete
return $node;
[136] Fix | Delete
}
[137] Fix | Delete
/**
[138] Fix | Delete
* Removes "raw" filters.
[139] Fix | Delete
*
[140] Fix | Delete
* @return \Twig_NodeInterface
[141] Fix | Delete
*/
[142] Fix | Delete
protected function optimizeRawFilter(\WPML\Core\Twig_NodeInterface $node, \WPML\Core\Twig\Environment $env)
[143] Fix | Delete
{
[144] Fix | Delete
if ($node instanceof \WPML\Core\Twig\Node\Expression\FilterExpression && 'raw' == $node->getNode('filter')->getAttribute('value')) {
[145] Fix | Delete
return $node->getNode('node');
[146] Fix | Delete
}
[147] Fix | Delete
return $node;
[148] Fix | Delete
}
[149] Fix | Delete
/**
[150] Fix | Delete
* Optimizes "for" tag by removing the "loop" variable creation whenever possible.
[151] Fix | Delete
*/
[152] Fix | Delete
protected function enterOptimizeFor(\WPML\Core\Twig_NodeInterface $node, \WPML\Core\Twig\Environment $env)
[153] Fix | Delete
{
[154] Fix | Delete
if ($node instanceof \WPML\Core\Twig\Node\ForNode) {
[155] Fix | Delete
// disable the loop variable by default
[156] Fix | Delete
$node->setAttribute('with_loop', \false);
[157] Fix | Delete
\array_unshift($this->loops, $node);
[158] Fix | Delete
\array_unshift($this->loopsTargets, $node->getNode('value_target')->getAttribute('name'));
[159] Fix | Delete
\array_unshift($this->loopsTargets, $node->getNode('key_target')->getAttribute('name'));
[160] Fix | Delete
} elseif (!$this->loops) {
[161] Fix | Delete
// we are outside a loop
[162] Fix | Delete
return;
[163] Fix | Delete
} elseif ($node instanceof \WPML\Core\Twig\Node\Expression\NameExpression && 'loop' === $node->getAttribute('name')) {
[164] Fix | Delete
$node->setAttribute('always_defined', \true);
[165] Fix | Delete
$this->addLoopToCurrent();
[166] Fix | Delete
} elseif ($node instanceof \WPML\Core\Twig\Node\Expression\NameExpression && \in_array($node->getAttribute('name'), $this->loopsTargets)) {
[167] Fix | Delete
$node->setAttribute('always_defined', \true);
[168] Fix | Delete
} elseif ($node instanceof \WPML\Core\Twig\Node\BlockReferenceNode || $node instanceof \WPML\Core\Twig\Node\Expression\BlockReferenceExpression) {
[169] Fix | Delete
$this->addLoopToCurrent();
[170] Fix | Delete
} elseif ($node instanceof \WPML\Core\Twig\Node\IncludeNode && !$node->getAttribute('only')) {
[171] Fix | Delete
$this->addLoopToAll();
[172] Fix | Delete
} elseif ($node instanceof \WPML\Core\Twig\Node\Expression\FunctionExpression && 'include' === $node->getAttribute('name') && (!$node->getNode('arguments')->hasNode('with_context') || \false !== $node->getNode('arguments')->getNode('with_context')->getAttribute('value'))) {
[173] Fix | Delete
$this->addLoopToAll();
[174] Fix | Delete
} elseif ($node instanceof \WPML\Core\Twig\Node\Expression\GetAttrExpression && (!$node->getNode('attribute') instanceof \WPML\Core\Twig\Node\Expression\ConstantExpression || 'parent' === $node->getNode('attribute')->getAttribute('value')) && (\true === $this->loops[0]->getAttribute('with_loop') || $node->getNode('node') instanceof \WPML\Core\Twig\Node\Expression\NameExpression && 'loop' === $node->getNode('node')->getAttribute('name'))) {
[175] Fix | Delete
$this->addLoopToAll();
[176] Fix | Delete
}
[177] Fix | Delete
}
[178] Fix | Delete
/**
[179] Fix | Delete
* Optimizes "for" tag by removing the "loop" variable creation whenever possible.
[180] Fix | Delete
*/
[181] Fix | Delete
protected function leaveOptimizeFor(\WPML\Core\Twig_NodeInterface $node, \WPML\Core\Twig\Environment $env)
[182] Fix | Delete
{
[183] Fix | Delete
if ($node instanceof \WPML\Core\Twig\Node\ForNode) {
[184] Fix | Delete
\array_shift($this->loops);
[185] Fix | Delete
\array_shift($this->loopsTargets);
[186] Fix | Delete
\array_shift($this->loopsTargets);
[187] Fix | Delete
}
[188] Fix | Delete
}
[189] Fix | Delete
protected function addLoopToCurrent()
[190] Fix | Delete
{
[191] Fix | Delete
$this->loops[0]->setAttribute('with_loop', \true);
[192] Fix | Delete
}
[193] Fix | Delete
protected function addLoopToAll()
[194] Fix | Delete
{
[195] Fix | Delete
foreach ($this->loops as $loop) {
[196] Fix | Delete
$loop->setAttribute('with_loop', \true);
[197] Fix | Delete
}
[198] Fix | Delete
}
[199] Fix | Delete
public function getPriority()
[200] Fix | Delete
{
[201] Fix | Delete
return 255;
[202] Fix | Delete
}
[203] Fix | Delete
}
[204] Fix | Delete
\class_alias('WPML\\Core\\Twig\\NodeVisitor\\OptimizerNodeVisitor', 'WPML\\Core\\Twig_NodeVisitor_Optimizer');
[205] Fix | Delete
[206] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function