mirror of
https://github.com/Combodo/iTop.git
synced 2026-05-19 07:12:26 +02:00
N°8834 - Add compatibility with PHP 8.4 (#819)
* N°8834 - Add compatibility with PHP 8.4 * Rollback of scssphp/scssphp version upgrade due to compilation error
This commit is contained in:
@@ -20,7 +20,7 @@ class Scope
|
||||
private array $data = [];
|
||||
private bool $left = false;
|
||||
|
||||
public function __construct(self $parent = null)
|
||||
public function __construct(?self $parent = null)
|
||||
{
|
||||
$this->parent = $parent;
|
||||
}
|
||||
|
||||
@@ -15,20 +15,24 @@ use Symfony\Bridge\Twig\Node\TransDefaultDomainNode;
|
||||
use Symfony\Bridge\Twig\Node\TransNode;
|
||||
use Twig\Environment;
|
||||
use Twig\Node\BlockNode;
|
||||
use Twig\Node\EmptyNode;
|
||||
use Twig\Node\Expression\ArrayExpression;
|
||||
use Twig\Node\Expression\AssignNameExpression;
|
||||
use Twig\Node\Expression\ConstantExpression;
|
||||
use Twig\Node\Expression\FilterExpression;
|
||||
use Twig\Node\Expression\NameExpression;
|
||||
use Twig\Node\Expression\Variable\AssignContextVariable;
|
||||
use Twig\Node\Expression\Variable\ContextVariable;
|
||||
use Twig\Node\ModuleNode;
|
||||
use Twig\Node\Node;
|
||||
use Twig\Node\Nodes;
|
||||
use Twig\Node\SetNode;
|
||||
use Twig\NodeVisitor\AbstractNodeVisitor;
|
||||
use Twig\NodeVisitor\NodeVisitorInterface;
|
||||
|
||||
/**
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
final class TranslationDefaultDomainNodeVisitor extends AbstractNodeVisitor
|
||||
final class TranslationDefaultDomainNodeVisitor implements NodeVisitorInterface
|
||||
{
|
||||
private Scope $scope;
|
||||
|
||||
@@ -37,7 +41,7 @@ final class TranslationDefaultDomainNodeVisitor extends AbstractNodeVisitor
|
||||
$this->scope = new Scope();
|
||||
}
|
||||
|
||||
protected function doEnterNode(Node $node, Environment $env): Node
|
||||
public function enterNode(Node $node, Environment $env): Node
|
||||
{
|
||||
if ($node instanceof BlockNode || $node instanceof ModuleNode) {
|
||||
$this->scope = $this->scope->enter();
|
||||
@@ -50,10 +54,14 @@ final class TranslationDefaultDomainNodeVisitor extends AbstractNodeVisitor
|
||||
return $node;
|
||||
} else {
|
||||
$var = $this->getVarName();
|
||||
$name = new AssignNameExpression($var, $node->getTemplateLine());
|
||||
$this->scope->set('domain', new NameExpression($var, $node->getTemplateLine()));
|
||||
$name = class_exists(AssignContextVariable::class) ? new AssignContextVariable($var, $node->getTemplateLine()) : new AssignNameExpression($var, $node->getTemplateLine());
|
||||
$this->scope->set('domain', class_exists(ContextVariable::class) ? new ContextVariable($var, $node->getTemplateLine()) : new NameExpression($var, $node->getTemplateLine()));
|
||||
|
||||
return new SetNode(false, new Node([$name]), new Node([$node->getNode('expr')]), $node->getTemplateLine());
|
||||
if (class_exists(Nodes::class)) {
|
||||
return new SetNode(false, new Nodes([$name]), new Nodes([$node->getNode('expr')]), $node->getTemplateLine());
|
||||
} else {
|
||||
return new SetNode(false, new Node([$name]), new Node([$node->getNode('expr')]), $node->getTemplateLine());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,8 +69,14 @@ final class TranslationDefaultDomainNodeVisitor extends AbstractNodeVisitor
|
||||
return $node;
|
||||
}
|
||||
|
||||
if ($node instanceof FilterExpression && 'trans' === $node->getNode('filter')->getAttribute('value')) {
|
||||
if ($node instanceof FilterExpression && 'trans' === ($node->hasAttribute('twig_callable') ? $node->getAttribute('twig_callable')->getName() : $node->getNode('filter')->getAttribute('value'))) {
|
||||
$arguments = $node->getNode('arguments');
|
||||
|
||||
if ($arguments instanceof EmptyNode) {
|
||||
$arguments = new Nodes();
|
||||
$node->setNode('arguments', $arguments);
|
||||
}
|
||||
|
||||
if ($this->isNamedArguments($arguments)) {
|
||||
if (!$arguments->hasNode('domain') && !$arguments->hasNode(1)) {
|
||||
$arguments->setNode('domain', $this->scope->get('domain'));
|
||||
@@ -83,7 +97,7 @@ final class TranslationDefaultDomainNodeVisitor extends AbstractNodeVisitor
|
||||
return $node;
|
||||
}
|
||||
|
||||
protected function doLeaveNode(Node $node, Environment $env): ?Node
|
||||
public function leaveNode(Node $node, Environment $env): ?Node
|
||||
{
|
||||
if ($node instanceof TransDefaultDomainNode) {
|
||||
return null;
|
||||
@@ -114,6 +128,6 @@ final class TranslationDefaultDomainNodeVisitor extends AbstractNodeVisitor
|
||||
|
||||
private function getVarName(): string
|
||||
{
|
||||
return sprintf('__internal_%s', hash('sha256', uniqid(mt_rand(), true), false));
|
||||
return \sprintf('__internal_%s', hash('sha256', uniqid(mt_rand(), true), false));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,14 +18,14 @@ use Twig\Node\Expression\ConstantExpression;
|
||||
use Twig\Node\Expression\FilterExpression;
|
||||
use Twig\Node\Expression\FunctionExpression;
|
||||
use Twig\Node\Node;
|
||||
use Twig\NodeVisitor\AbstractNodeVisitor;
|
||||
use Twig\NodeVisitor\NodeVisitorInterface;
|
||||
|
||||
/**
|
||||
* TranslationNodeVisitor extracts translation messages.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
final class TranslationNodeVisitor extends AbstractNodeVisitor
|
||||
final class TranslationNodeVisitor implements NodeVisitorInterface
|
||||
{
|
||||
public const UNDEFINED_DOMAIN = '_undefined';
|
||||
|
||||
@@ -49,7 +49,7 @@ final class TranslationNodeVisitor extends AbstractNodeVisitor
|
||||
return $this->messages;
|
||||
}
|
||||
|
||||
protected function doEnterNode(Node $node, Environment $env): Node
|
||||
public function enterNode(Node $node, Environment $env): Node
|
||||
{
|
||||
if (!$this->enabled) {
|
||||
return $node;
|
||||
@@ -57,7 +57,7 @@ final class TranslationNodeVisitor extends AbstractNodeVisitor
|
||||
|
||||
if (
|
||||
$node instanceof FilterExpression
|
||||
&& 'trans' === $node->getNode('filter')->getAttribute('value')
|
||||
&& 'trans' === ($node->hasAttribute('twig_callable') ? $node->getAttribute('twig_callable')->getName() : $node->getNode('filter')->getAttribute('value'))
|
||||
&& $node->getNode('node') instanceof ConstantExpression
|
||||
) {
|
||||
// extract constant nodes with a trans filter
|
||||
@@ -85,7 +85,7 @@ final class TranslationNodeVisitor extends AbstractNodeVisitor
|
||||
];
|
||||
} elseif (
|
||||
$node instanceof FilterExpression
|
||||
&& 'trans' === $node->getNode('filter')->getAttribute('value')
|
||||
&& 'trans' === ($node->hasAttribute('twig_callable') ? $node->getAttribute('twig_callable')->getName() : $node->getNode('filter')->getAttribute('value'))
|
||||
&& $node->getNode('node') instanceof ConcatBinary
|
||||
&& $message = $this->getConcatValueFromNode($node->getNode('node'), null)
|
||||
) {
|
||||
@@ -98,7 +98,7 @@ final class TranslationNodeVisitor extends AbstractNodeVisitor
|
||||
return $node;
|
||||
}
|
||||
|
||||
protected function doLeaveNode(Node $node, Environment $env): ?Node
|
||||
public function leaveNode(Node $node, Environment $env): ?Node
|
||||
{
|
||||
return $node;
|
||||
}
|
||||
@@ -149,6 +149,22 @@ final class TranslationNodeVisitor extends AbstractNodeVisitor
|
||||
return $node->getAttribute('value');
|
||||
}
|
||||
|
||||
if (
|
||||
$node instanceof FunctionExpression
|
||||
&& 'constant' === $node->getAttribute('name')
|
||||
) {
|
||||
$nodeArguments = $node->getNode('arguments');
|
||||
if ($nodeArguments->getIterator()->current() instanceof ConstantExpression) {
|
||||
$constantName = $nodeArguments->getIterator()->current()->getAttribute('value');
|
||||
if (\defined($constantName)) {
|
||||
$value = \constant($constantName);
|
||||
if (\is_string($value)) {
|
||||
return $value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return self::UNDEFINED_DOMAIN;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user