mirror of
https://github.com/twigphp/Twig.git
synced 2026-09-16 12:26:30 +00:00
Move to PHPStan level 5
This commit is contained in:
+1
-1
@@ -2,7 +2,7 @@ includes:
|
|||||||
- phpstan-baseline.neon
|
- phpstan-baseline.neon
|
||||||
|
|
||||||
parameters:
|
parameters:
|
||||||
level: 4
|
level: 5
|
||||||
paths:
|
paths:
|
||||||
- src
|
- src
|
||||||
excludePaths:
|
excludePaths:
|
||||||
|
|||||||
+1
-1
@@ -495,7 +495,7 @@ class Environment
|
|||||||
return $this->load($name);
|
return $this->load($name);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new LoaderError(\sprintf('Unable to find one of the following templates: "%s".', implode('", "', $names)));
|
throw new LoaderError(\sprintf('Unable to find one of the following templates: "%s".', implode('", "', array_map(fn ($name) => $name instanceof TemplateWrapper ? $name->getTemplateName() : $name, $names))));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
namespace Twig\ExpressionParser\Infix;
|
namespace Twig\ExpressionParser\Infix;
|
||||||
|
|
||||||
use Twig\Error\SyntaxError;
|
use Twig\Error\SyntaxError;
|
||||||
|
use Twig\Node\Expression\AbstractExpression;
|
||||||
use Twig\Node\Expression\ArrayExpression;
|
use Twig\Node\Expression\ArrayExpression;
|
||||||
use Twig\Node\Expression\Binary\SetBinary;
|
use Twig\Node\Expression\Binary\SetBinary;
|
||||||
use Twig\Node\Expression\Unary\SpreadUnary;
|
use Twig\Node\Expression\Unary\SpreadUnary;
|
||||||
@@ -27,6 +28,7 @@ trait ArgumentsTrait
|
|||||||
{
|
{
|
||||||
$arguments = new ArrayExpression([], $line);
|
$arguments = new ArrayExpression([], $line);
|
||||||
foreach ($this->parseNamedArguments($parser, $parseOpenParenthesis) as $k => $n) {
|
foreach ($this->parseNamedArguments($parser, $parseOpenParenthesis) as $k => $n) {
|
||||||
|
/** @var AbstractExpression $n */
|
||||||
$arguments->addElement($n, new LocalVariable($k, $line));
|
$arguments->addElement($n, new LocalVariable($k, $line));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ use Twig\Node\EmptyNode;
|
|||||||
use Twig\Node\Expression\AbstractExpression;
|
use Twig\Node\Expression\AbstractExpression;
|
||||||
use Twig\Node\Expression\MacroReferenceExpression;
|
use Twig\Node\Expression\MacroReferenceExpression;
|
||||||
use Twig\Node\Expression\Variable\ContextVariable;
|
use Twig\Node\Expression\Variable\ContextVariable;
|
||||||
|
use Twig\Node\Expression\Variable\TemplateVariable;
|
||||||
use Twig\Parser;
|
use Twig\Parser;
|
||||||
use Twig\Token;
|
use Twig\Token;
|
||||||
|
|
||||||
@@ -40,7 +41,10 @@ final class FunctionExpressionParser extends AbstractExpressionParser implements
|
|||||||
$name = $expr->getAttribute('name');
|
$name = $expr->getAttribute('name');
|
||||||
|
|
||||||
if (null !== $alias = $parser->getImportedSymbol('function', $name)) {
|
if (null !== $alias = $parser->getImportedSymbol('function', $name)) {
|
||||||
return new MacroReferenceExpression($alias['node']->getNode('var'), $alias['name'], $this->parseCallableArguments($parser, $line, false), $line);
|
/** @var TemplateVariable $var */
|
||||||
|
$var = $alias['node']->getNode('var');
|
||||||
|
|
||||||
|
return new MacroReferenceExpression($var, $alias['name'], $this->parseCallableArguments($parser, $line, false), $line);
|
||||||
}
|
}
|
||||||
|
|
||||||
$args = $this->parseNamedArguments($parser, false);
|
$args = $this->parseNamedArguments($parser, false);
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ use Twig\Node\Expression\AbstractExpression;
|
|||||||
use Twig\Node\Expression\ArrayExpression;
|
use Twig\Node\Expression\ArrayExpression;
|
||||||
use Twig\Node\Expression\MacroReferenceExpression;
|
use Twig\Node\Expression\MacroReferenceExpression;
|
||||||
use Twig\Node\Expression\Variable\ContextVariable;
|
use Twig\Node\Expression\Variable\ContextVariable;
|
||||||
|
use Twig\Node\Expression\Variable\TemplateVariable;
|
||||||
use Twig\Node\Nodes;
|
use Twig\Node\Nodes;
|
||||||
use Twig\Parser;
|
use Twig\Parser;
|
||||||
use Twig\Token;
|
use Twig\Token;
|
||||||
@@ -43,7 +44,9 @@ class IsExpressionParser extends AbstractExpressionParser implements InfixExpres
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ('defined' === $test->getName() && $expr instanceof ContextVariable && null !== $alias = $parser->getImportedSymbol('function', $expr->getAttribute('name'))) {
|
if ('defined' === $test->getName() && $expr instanceof ContextVariable && null !== $alias = $parser->getImportedSymbol('function', $expr->getAttribute('name'))) {
|
||||||
$expr = new MacroReferenceExpression($alias['node']->getNode('var'), $alias['name'], new ArrayExpression([], $expr->getTemplateLine()), $expr->getTemplateLine());
|
/** @var TemplateVariable $var */
|
||||||
|
$var = $alias['node']->getNode('var');
|
||||||
|
$expr = new MacroReferenceExpression($var, $alias['name'], new ArrayExpression([], $expr->getTemplateLine()), $expr->getTemplateLine());
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ($test->getNodeClass())($expr, $test, $arguments, $stream->getCurrent()->getLine());
|
return new ($test->getNodeClass())($expr, $test, $arguments, $stream->getCurrent()->getLine());
|
||||||
|
|||||||
@@ -2041,7 +2041,10 @@ final class CoreExtension extends AbstractExtension
|
|||||||
$dep->triggerDeprecation($src->getPath() ?: $src->getName(), $line);
|
$dep->triggerDeprecation($src->getPath() ?: $src->getName(), $line);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
return new GetAttrExpression($args[0], $args[1], $args[2] ?? null, Template::ANY_CALL, $line);
|
/** @var ArrayExpression|ContextVariable|null $arguments */
|
||||||
|
$arguments = $args[2] ?? null;
|
||||||
|
|
||||||
|
return new GetAttrExpression($args[0], $args[1], $arguments, Template::ANY_CALL, $line);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ class DefaultFilter extends FilterExpression
|
|||||||
|
|
||||||
if ('default' === $name && ($node instanceof ContextVariable || $node instanceof GetAttrExpression)) {
|
if ('default' === $name && ($node instanceof ContextVariable || $node instanceof GetAttrExpression)) {
|
||||||
$test = new DefinedTest(clone $node, new TwigTest('defined'), new EmptyNode(), $node->getTemplateLine());
|
$test = new DefinedTest(clone $node, new TwigTest('defined'), new EmptyNode(), $node->getTemplateLine());
|
||||||
|
/** @var AbstractExpression $false */
|
||||||
$false = \count($arguments) ? $arguments->getNode(0) : new ConstantExpression('', $node->getTemplateLine());
|
$false = \count($arguments) ? $arguments->getNode(0) : new ConstantExpression('', $node->getTemplateLine());
|
||||||
|
|
||||||
$node = new ConditionalTernary($test, $default, $false, $node->getTemplateLine());
|
$node = new ConditionalTernary($test, $default, $false, $node->getTemplateLine());
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ namespace Twig\Node;
|
|||||||
|
|
||||||
use Twig\Attribute\YieldReady;
|
use Twig\Attribute\YieldReady;
|
||||||
use Twig\Compiler;
|
use Twig\Compiler;
|
||||||
|
use Twig\Node\Expression\AbstractExpression;
|
||||||
use Twig\Node\Expression\ReturnPrimitiveTypeInterface;
|
use Twig\Node\Expression\ReturnPrimitiveTypeInterface;
|
||||||
use Twig\Node\Expression\Test\TrueTest;
|
use Twig\Node\Expression\Test\TrueTest;
|
||||||
use Twig\TwigTest;
|
use Twig\TwigTest;
|
||||||
@@ -31,6 +32,7 @@ class IfNode extends Node
|
|||||||
for ($i = 0, $count = \count($tests); $i < $count; $i += 2) {
|
for ($i = 0, $count = \count($tests); $i < $count; $i += 2) {
|
||||||
$test = $tests->getNode((string) $i);
|
$test = $tests->getNode((string) $i);
|
||||||
if (!$test instanceof ReturnPrimitiveTypeInterface) {
|
if (!$test instanceof ReturnPrimitiveTypeInterface) {
|
||||||
|
/** @var AbstractExpression $test */
|
||||||
$tests->setNode($i, new TrueTest($test, new TwigTest('true'), null, $test->getTemplateLine()));
|
$tests->setNode($i, new TrueTest($test, new TwigTest('true'), null, $test->getTemplateLine()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,8 +80,10 @@ final class EscaperNodeVisitor implements NodeVisitorInterface
|
|||||||
} elseif ($node instanceof FilterExpression) {
|
} elseif ($node instanceof FilterExpression) {
|
||||||
return $this->preEscapeFilterNode($node, $env);
|
return $this->preEscapeFilterNode($node, $env);
|
||||||
} elseif ($node instanceof PrintNode && false !== $type = $this->needEscaping()) {
|
} elseif ($node instanceof PrintNode && false !== $type = $this->needEscaping()) {
|
||||||
|
/** @var AbstractExpression $expression */
|
||||||
$expression = $node->getNode('expr');
|
$expression = $node->getNode('expr');
|
||||||
if ($expression instanceof OperatorEscapeInterface) {
|
if ($expression instanceof OperatorEscapeInterface) {
|
||||||
|
/** @var AbstractExpression&OperatorEscapeInterface $expression */
|
||||||
$this->escapeConditional($expression, $env, $type);
|
$this->escapeConditional($expression, $env, $type);
|
||||||
} else {
|
} else {
|
||||||
$node->setNode('expr', $this->escapeExpression($expression, $env, $type));
|
$node->setNode('expr', $this->escapeExpression($expression, $env, $type));
|
||||||
@@ -102,8 +104,10 @@ final class EscaperNodeVisitor implements NodeVisitorInterface
|
|||||||
private function escapeConditional(AbstractExpression&OperatorEscapeInterface $expression, Environment $env, string $type): void
|
private function escapeConditional(AbstractExpression&OperatorEscapeInterface $expression, Environment $env, string $type): void
|
||||||
{
|
{
|
||||||
foreach ($expression->getOperandNamesToEscape() as $name) {
|
foreach ($expression->getOperandNamesToEscape() as $name) {
|
||||||
|
/** @var AbstractExpression $operand */
|
||||||
$operand = $expression->getNode($name);
|
$operand = $expression->getNode($name);
|
||||||
if ($operand instanceof OperatorEscapeInterface) {
|
if ($operand instanceof OperatorEscapeInterface) {
|
||||||
|
/** @var AbstractExpression&OperatorEscapeInterface $operand */
|
||||||
$this->escapeConditional($operand, $env, $type);
|
$this->escapeConditional($operand, $env, $type);
|
||||||
} else {
|
} else {
|
||||||
$expression->setNode($name, $this->escapeExpression($operand, $env, $type));
|
$expression->setNode($name, $this->escapeExpression($operand, $env, $type));
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
namespace Twig\Util;
|
namespace Twig\Util;
|
||||||
|
|
||||||
use Twig\Error\SyntaxError;
|
use Twig\Error\SyntaxError;
|
||||||
|
use Twig\Node\Expression\AbstractExpression;
|
||||||
use Twig\Node\Expression\ArrayExpression;
|
use Twig\Node\Expression\ArrayExpression;
|
||||||
use Twig\Node\Expression\ConstantExpression;
|
use Twig\Node\Expression\ConstantExpression;
|
||||||
use Twig\Node\Expression\VariadicExpression;
|
use Twig\Node\Expression\VariadicExpression;
|
||||||
@@ -35,15 +36,16 @@ final class CallableArgumentsExtractor
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array<Node>
|
* @return array<AbstractExpression>
|
||||||
*/
|
*/
|
||||||
public function extractArguments(Node $arguments): array
|
public function extractArguments(Node $arguments): array
|
||||||
{
|
{
|
||||||
/** @var array<int|string, Node> $extractedArguments */
|
/** @var array<int|string, AbstractExpression> $extractedArguments */
|
||||||
$extractedArguments = [];
|
$extractedArguments = [];
|
||||||
$extractedArgumentNameMap = [];
|
$extractedArgumentNameMap = [];
|
||||||
$named = false;
|
$named = false;
|
||||||
foreach ($arguments as $name => $node) {
|
foreach ($arguments as $name => $node) {
|
||||||
|
/** @var AbstractExpression $node */
|
||||||
if (!\is_int($name)) {
|
if (!\is_int($name)) {
|
||||||
$named = true;
|
$named = true;
|
||||||
} elseif ($named) {
|
} elseif ($named) {
|
||||||
@@ -74,6 +76,7 @@ final class CallableArgumentsExtractor
|
|||||||
}
|
}
|
||||||
|
|
||||||
[$callableParameters, $isPhpVariadic] = $this->getCallableParameters();
|
[$callableParameters, $isPhpVariadic] = $this->getCallableParameters();
|
||||||
|
/** @var list<AbstractExpression> $arguments */
|
||||||
$arguments = [];
|
$arguments = [];
|
||||||
$callableParameterNames = [];
|
$callableParameterNames = [];
|
||||||
$missingArguments = [];
|
$missingArguments = [];
|
||||||
|
|||||||
Reference in New Issue
Block a user