From d9d7e136c13d4bcd67eb8a6edb4dc32bb4814fee Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Wed, 7 Feb 2024 08:31:24 +0100 Subject: [PATCH 1/4] fix TwigExtraBundle tests with Symfony 6.0/6.1 --- extra/twig-extra-bundle/Tests/Fixture/Kernel.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/extra/twig-extra-bundle/Tests/Fixture/Kernel.php b/extra/twig-extra-bundle/Tests/Fixture/Kernel.php index 857ed95d4..faad85c18 100644 --- a/extra/twig-extra-bundle/Tests/Fixture/Kernel.php +++ b/extra/twig-extra-bundle/Tests/Fixture/Kernel.php @@ -5,6 +5,7 @@ namespace Twig\Extra\TwigExtraBundle\Tests\Fixture; use League\CommonMark\Extension\Strikethrough\StrikethroughExtension; use Symfony\Bundle\FrameworkBundle\FrameworkBundle; use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait; +use Symfony\Bundle\FrameworkBundle\Test\NotificationAssertionsTrait; use Symfony\Bundle\TwigBundle\TwigBundle; use Symfony\Component\Config\Loader\LoaderInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; @@ -29,11 +30,16 @@ class Kernel extends BaseKernel 'test' => true, 'router' => ['utf8' => true], 'http_method_override' => false, + 'php_errors' => [ + 'log' => true, + ], ]; - if (6 === Kernel::MAJOR_VERSION) { + + // the "handle_all_throwables" option was introduced in FrameworkBundle 6.2 (and so was the NotificationAssertionsTrait) + if (trait_exists(NotificationAssertionsTrait::class)) { $config['handle_all_throwables'] = true; - $config['php_errors']['log'] = true; } + $c->loadFromExtension('framework', $config); $c->loadFromExtension('twig', [ 'default_path' => __DIR__.'/views', From 675f62d60c546a6a2590a837c8d6580093ff0a5a Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Wed, 7 Feb 2024 12:11:29 +0100 Subject: [PATCH 2/4] Update PHPUnit schema --- phpunit.xml.dist | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 9af92f463..24d5bd9ea 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,5 +1,6 @@ - + + ./tests/ From 2836af3d3f14740b2fed7ea4de8e9a5513a1d728 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Sat, 10 Feb 2024 02:32:40 +0100 Subject: [PATCH 3/4] Remove redundant "$thing instanceof \Countable" check The check L1183 is redundant as "$thing instanceof \Countable" is already checked L1175. ```php if ($thing instanceof \Countable || \is_array($thing) || $thing instanceof \SimpleXMLElement) { return \count($thing); } if ($thing instanceof \Traversable) { return iterator_count($thing); } if (method_exists($thing, '__toString') && !$thing instanceof \Countable) { return mb_strlen((string) $thing, $env->getCharset()); } ``` --- src/Extension/CoreExtension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Extension/CoreExtension.php b/src/Extension/CoreExtension.php index 598caca45..f90a9ce44 100644 --- a/src/Extension/CoreExtension.php +++ b/src/Extension/CoreExtension.php @@ -1180,7 +1180,7 @@ final class CoreExtension extends AbstractExtension return iterator_count($thing); } - if (method_exists($thing, '__toString') && !$thing instanceof \Countable) { + if (method_exists($thing, '__toString')) { return mb_strlen((string) $thing, $env->getCharset()); } From f7f11ea410c38fd38b7d9bad3b45be903159c45c Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Sat, 10 Feb 2024 09:49:29 +0100 Subject: [PATCH 4/4] Fix CS --- extra/cache-extra/Tests/FunctionalTest.php | 2 +- extra/html-extra/HtmlExtension.php | 4 +- .../html-extra/Tests/LegacyFunctionsTest.php | 2 +- extra/intl-extra/IntlExtension.php | 38 +++++++++---------- extra/markdown-extra/ErusevMarkdown.php | 2 +- extra/markdown-extra/LeagueMarkdown.php | 2 +- extra/markdown-extra/MichelfMarkdown.php | 2 +- extra/string-extra/StringExtension.php | 2 +- src/Environment.php | 6 +-- src/Error/Error.php | 4 +- src/Extension/CoreExtension.php | 1 - src/Extension/SandboxExtension.php | 12 +++--- src/Extension/StringLoaderExtension.php | 2 +- src/Loader/FilesystemLoader.php | 2 +- src/Node/BlockNode.php | 2 +- src/Node/BlockReferenceNode.php | 2 +- src/Node/CaptureNode.php | 4 +- src/Node/DeprecatedNode.php | 2 +- src/Node/DoNode.php | 2 +- src/Node/EmbedNode.php | 2 +- src/Node/Expression/ArrayExpression.php | 2 +- .../Expression/BlockReferenceExpression.php | 2 +- src/Node/Expression/Filter/DefaultFilter.php | 2 +- src/Node/Expression/FilterExpression.php | 2 +- src/Node/Expression/ParentExpression.php | 2 +- src/Node/ForLoopNode.php | 2 +- src/Node/ForNode.php | 2 +- src/Node/IfNode.php | 2 +- src/Node/ImportNode.php | 2 +- src/Node/IncludeNode.php | 2 +- src/Node/MacroNode.php | 2 +- src/Node/Node.php | 2 +- src/Node/PrintNode.php | 2 +- src/Node/SandboxNode.php | 2 +- src/Node/SetNode.php | 2 +- src/Node/WithNode.php | 2 +- src/NodeVisitor/OptimizerNodeVisitor.php | 2 +- src/NodeVisitor/SafeAnalysisNodeVisitor.php | 2 +- src/Parser.php | 2 +- src/Resources/string_loader.php | 3 +- src/Template.php | 2 +- src/Test/NodeTestCase.php | 4 +- src/TokenStream.php | 4 +- src/YieldingTemplate.php | 4 +- tests/Node/BlockTest.php | 6 +-- tests/Node/SetTest.php | 1 - 46 files changed, 78 insertions(+), 79 deletions(-) diff --git a/extra/cache-extra/Tests/FunctionalTest.php b/extra/cache-extra/Tests/FunctionalTest.php index 111026a89..0ae24436e 100644 --- a/extra/cache-extra/Tests/FunctionalTest.php +++ b/extra/cache-extra/Tests/FunctionalTest.php @@ -65,7 +65,7 @@ class FunctionalTest extends TestCase $twig->render('index'); } - private function createEnvironment(array $templates, ArrayAdapter $cache = null): Environment + private function createEnvironment(array $templates, ?ArrayAdapter $cache = null): Environment { $twig = new Environment(new ArrayLoader($templates)); $cache = $cache ?? new ArrayAdapter(); diff --git a/extra/html-extra/HtmlExtension.php b/extra/html-extra/HtmlExtension.php index d5842bf50..e4cf9d3bd 100644 --- a/extra/html-extra/HtmlExtension.php +++ b/extra/html-extra/HtmlExtension.php @@ -21,7 +21,7 @@ final class HtmlExtension extends AbstractExtension { private $mimeTypes; - public function __construct(MimeTypes $mimeTypes = null) + public function __construct(?MimeTypes $mimeTypes = null) { $this->mimeTypes = $mimeTypes; } @@ -50,7 +50,7 @@ final class HtmlExtension extends AbstractExtension * * @internal */ - public function dataUri(string $data, string $mime = null, array $parameters = []): string + public function dataUri(string $data, ?string $mime = null, array $parameters = []): string { $repr = 'data:'; diff --git a/extra/html-extra/Tests/LegacyFunctionsTest.php b/extra/html-extra/Tests/LegacyFunctionsTest.php index 4e290fb8c..accf8afb3 100644 --- a/extra/html-extra/Tests/LegacyFunctionsTest.php +++ b/extra/html-extra/Tests/LegacyFunctionsTest.php @@ -21,6 +21,6 @@ class LegacyFunctionsTest extends TestCase { public function testHtmlToMarkdown() { - $this->assertSame(HtmlExtension::htmlClasses(['charset' => 'utf-8']), \twig_html_classes(['charset' => 'utf-8'])); + $this->assertSame(HtmlExtension::htmlClasses(['charset' => 'utf-8']), twig_html_classes(['charset' => 'utf-8'])); } } diff --git a/extra/intl-extra/IntlExtension.php b/extra/intl-extra/IntlExtension.php index 13d4a4e47..0b33331f6 100644 --- a/extra/intl-extra/IntlExtension.php +++ b/extra/intl-extra/IntlExtension.php @@ -150,7 +150,7 @@ final class IntlExtension extends AbstractExtension private $dateFormatterPrototype; private $numberFormatterPrototype; - public function __construct(\IntlDateFormatter $dateFormatterPrototype = null, \NumberFormatter $numberFormatterPrototype = null) + public function __construct(?\IntlDateFormatter $dateFormatterPrototype = null, ?\NumberFormatter $numberFormatterPrototype = null) { $this->dateFormatterPrototype = $dateFormatterPrototype; $this->numberFormatterPrototype = $numberFormatterPrototype; @@ -191,7 +191,7 @@ final class IntlExtension extends AbstractExtension ]; } - public function getCountryName(?string $country, string $locale = null): string + public function getCountryName(?string $country, ?string $locale = null): string { if (null === $country) { return ''; @@ -204,7 +204,7 @@ final class IntlExtension extends AbstractExtension } } - public function getCurrencyName(?string $currency, string $locale = null): string + public function getCurrencyName(?string $currency, ?string $locale = null): string { if (null === $currency) { return ''; @@ -217,7 +217,7 @@ final class IntlExtension extends AbstractExtension } } - public function getCurrencySymbol(?string $currency, string $locale = null): string + public function getCurrencySymbol(?string $currency, ?string $locale = null): string { if (null === $currency) { return ''; @@ -230,7 +230,7 @@ final class IntlExtension extends AbstractExtension } } - public function getLanguageName(?string $language, string $locale = null): string + public function getLanguageName(?string $language, ?string $locale = null): string { if (null === $language) { return ''; @@ -243,7 +243,7 @@ final class IntlExtension extends AbstractExtension } } - public function getLocaleName(?string $data, string $locale = null): string + public function getLocaleName(?string $data, ?string $locale = null): string { if (null === $data) { return ''; @@ -256,7 +256,7 @@ final class IntlExtension extends AbstractExtension } } - public function getTimezoneName(?string $timezone, string $locale = null): string + public function getTimezoneName(?string $timezone, ?string $locale = null): string { if (null === $timezone) { return ''; @@ -278,7 +278,7 @@ final class IntlExtension extends AbstractExtension } } - public function getLanguageNames(string $locale = null): array + public function getLanguageNames(?string $locale = null): array { try { return Languages::getNames($locale); @@ -287,7 +287,7 @@ final class IntlExtension extends AbstractExtension } } - public function getScriptNames(string $locale = null): array + public function getScriptNames(?string $locale = null): array { try { return Scripts::getNames($locale); @@ -296,7 +296,7 @@ final class IntlExtension extends AbstractExtension } } - public function getCountryNames(string $locale = null): array + public function getCountryNames(?string $locale = null): array { try { return Countries::getNames($locale); @@ -305,7 +305,7 @@ final class IntlExtension extends AbstractExtension } } - public function getLocaleNames(string $locale = null): array + public function getLocaleNames(?string $locale = null): array { try { return Locales::getNames($locale); @@ -314,7 +314,7 @@ final class IntlExtension extends AbstractExtension } } - public function getCurrencyNames(string $locale = null): array + public function getCurrencyNames(?string $locale = null): array { try { return Currencies::getNames($locale); @@ -323,7 +323,7 @@ final class IntlExtension extends AbstractExtension } } - public function getTimezoneNames(string $locale = null): array + public function getTimezoneNames(?string $locale = null): array { try { return Timezones::getNames($locale); @@ -332,7 +332,7 @@ final class IntlExtension extends AbstractExtension } } - public function formatCurrency($amount, string $currency, array $attrs = [], string $locale = null): string + public function formatCurrency($amount, string $currency, array $attrs = [], ?string $locale = null): string { $formatter = $this->createNumberFormatter($locale, 'currency', $attrs); @@ -343,7 +343,7 @@ final class IntlExtension extends AbstractExtension return $ret; } - public function formatNumber($number, array $attrs = [], string $style = 'decimal', string $type = 'default', string $locale = null): string + public function formatNumber($number, array $attrs = [], string $style = 'decimal', string $type = 'default', ?string $locale = null): string { if (!isset(self::NUMBER_TYPES[$type])) { throw new RuntimeError(sprintf('The type "%s" does not exist, known types are: "%s".', $type, implode('", "', array_keys(self::NUMBER_TYPES)))); @@ -358,7 +358,7 @@ final class IntlExtension extends AbstractExtension return $ret; } - public function formatNumberStyle(string $style, $number, array $attrs = [], string $type = 'default', string $locale = null): string + public function formatNumberStyle(string $style, $number, array $attrs = [], string $type = 'default', ?string $locale = null): string { return $this->formatNumber($number, $attrs, $style, $type, $locale); } @@ -367,7 +367,7 @@ final class IntlExtension extends AbstractExtension * @param \DateTimeInterface|string|null $date A date or null to use the current time * @param \DateTimeZone|string|false|null $timezone The target timezone, null to use the default, false to leave unchanged */ - public function formatDateTime(Environment $env, $date, ?string $dateFormat = 'medium', ?string $timeFormat = 'medium', string $pattern = '', $timezone = null, string $calendar = 'gregorian', string $locale = null): string + public function formatDateTime(Environment $env, $date, ?string $dateFormat = 'medium', ?string $timeFormat = 'medium', string $pattern = '', $timezone = null, string $calendar = 'gregorian', ?string $locale = null): string { $date = CoreExtension::dateConverter($env, $date, $timezone); @@ -390,7 +390,7 @@ final class IntlExtension extends AbstractExtension * @param \DateTimeInterface|string|null $date A date or null to use the current time * @param \DateTimeZone|string|false|null $timezone The target timezone, null to use the default, false to leave unchanged */ - public function formatDate(Environment $env, $date, ?string $dateFormat = 'medium', string $pattern = '', $timezone = null, string $calendar = 'gregorian', string $locale = null): string + public function formatDate(Environment $env, $date, ?string $dateFormat = 'medium', string $pattern = '', $timezone = null, string $calendar = 'gregorian', ?string $locale = null): string { return $this->formatDateTime($env, $date, $dateFormat, 'none', $pattern, $timezone, $calendar, $locale); } @@ -399,7 +399,7 @@ final class IntlExtension extends AbstractExtension * @param \DateTimeInterface|string|null $date A date or null to use the current time * @param \DateTimeZone|string|false|null $timezone The target timezone, null to use the default, false to leave unchanged */ - public function formatTime(Environment $env, $date, ?string $timeFormat = 'medium', string $pattern = '', $timezone = null, string $calendar = 'gregorian', string $locale = null): string + public function formatTime(Environment $env, $date, ?string $timeFormat = 'medium', string $pattern = '', $timezone = null, string $calendar = 'gregorian', ?string $locale = null): string { return $this->formatDateTime($env, $date, 'none', $timeFormat, $pattern, $timezone, $calendar, $locale); } diff --git a/extra/markdown-extra/ErusevMarkdown.php b/extra/markdown-extra/ErusevMarkdown.php index f4f7e1c48..47b030893 100644 --- a/extra/markdown-extra/ErusevMarkdown.php +++ b/extra/markdown-extra/ErusevMarkdown.php @@ -17,7 +17,7 @@ class ErusevMarkdown implements MarkdownInterface { private $converter; - public function __construct(Parsedown $converter = null) + public function __construct(?Parsedown $converter = null) { $this->converter = $converter ?: new Parsedown(); } diff --git a/extra/markdown-extra/LeagueMarkdown.php b/extra/markdown-extra/LeagueMarkdown.php index 2390901c0..be2667702 100644 --- a/extra/markdown-extra/LeagueMarkdown.php +++ b/extra/markdown-extra/LeagueMarkdown.php @@ -18,7 +18,7 @@ class LeagueMarkdown implements MarkdownInterface private $converter; private $legacySupport; - public function __construct(CommonMarkConverter $converter = null) + public function __construct(?CommonMarkConverter $converter = null) { $this->converter = $converter ?: new CommonMarkConverter(); $this->legacySupport = !method_exists($this->converter, 'convert'); diff --git a/extra/markdown-extra/MichelfMarkdown.php b/extra/markdown-extra/MichelfMarkdown.php index 2660a7f04..0acc3a3a4 100644 --- a/extra/markdown-extra/MichelfMarkdown.php +++ b/extra/markdown-extra/MichelfMarkdown.php @@ -17,7 +17,7 @@ class MichelfMarkdown implements MarkdownInterface { private $converter; - public function __construct(MarkdownExtra $converter = null) + public function __construct(?MarkdownExtra $converter = null) { if (null === $converter) { $converter = new MarkdownExtra(); diff --git a/extra/string-extra/StringExtension.php b/extra/string-extra/StringExtension.php index 7b5d00492..2e827af05 100644 --- a/extra/string-extra/StringExtension.php +++ b/extra/string-extra/StringExtension.php @@ -22,7 +22,7 @@ final class StringExtension extends AbstractExtension { private $slugger; - public function __construct(SluggerInterface $slugger = null) + public function __construct(?SluggerInterface $slugger = null) { $this->slugger = $slugger ?: new AsciiSlugger(); } diff --git a/src/Environment.php b/src/Environment.php index 5ec708bc7..f05de2774 100644 --- a/src/Environment.php +++ b/src/Environment.php @@ -278,7 +278,7 @@ class Environment * * @internal */ - public function getTemplateClass(string $name, int $index = null): string + public function getTemplateClass(string $name, ?int $index = null): string { $key = $this->getLoader()->getCacheKey($name).$this->optionsHash; @@ -346,7 +346,7 @@ class Environment * * @internal */ - public function loadTemplate(string $cls, string $name, int $index = null): Template + public function loadTemplate(string $cls, string $name, ?int $index = null): Template { $mainCls = $cls; if (null !== $index) { @@ -401,7 +401,7 @@ class Environment * @throws LoaderError When the template cannot be found * @throws SyntaxError When an error occurred during compilation */ - public function createTemplate(string $template, string $name = null): TemplateWrapper + public function createTemplate(string $template, ?string $name = null): TemplateWrapper { $hash = hash(\PHP_VERSION_ID < 80100 ? 'sha256' : 'xxh128', $template, false); if (null !== $name) { diff --git a/src/Error/Error.php b/src/Error/Error.php index bca1fa64c..0df213598 100644 --- a/src/Error/Error.php +++ b/src/Error/Error.php @@ -53,7 +53,7 @@ class Error extends \Exception * @param int $lineno The template line where the error occurred * @param Source|null $source The source context where the error occurred */ - public function __construct(string $message, int $lineno = -1, Source $source = null, \Throwable $previous = null) + public function __construct(string $message, int $lineno = -1, ?Source $source = null, ?\Throwable $previous = null) { parent::__construct('', 0, $previous); @@ -93,7 +93,7 @@ class Error extends \Exception return $this->name ? new Source($this->sourceCode, $this->name, $this->sourcePath) : null; } - public function setSourceContext(Source $source = null): void + public function setSourceContext(?Source $source = null): void { if (null === $source) { $this->sourceCode = $this->name = $this->sourcePath = null; diff --git a/src/Extension/CoreExtension.php b/src/Extension/CoreExtension.php index 598caca45..0f28e233d 100644 --- a/src/Extension/CoreExtension.php +++ b/src/Extension/CoreExtension.php @@ -15,7 +15,6 @@ use Twig\Environment; use Twig\Error\LoaderError; use Twig\Error\RuntimeError; use Twig\ExpressionParser; -use Twig\Extension\SandboxExtension; use Twig\Markup; use Twig\Node\Expression\Binary\AddBinary; use Twig\Node\Expression\Binary\AndBinary; diff --git a/src/Extension/SandboxExtension.php b/src/Extension/SandboxExtension.php index c942682d1..921df287a 100644 --- a/src/Extension/SandboxExtension.php +++ b/src/Extension/SandboxExtension.php @@ -26,7 +26,7 @@ final class SandboxExtension extends AbstractExtension private $policy; private $sourcePolicy; - public function __construct(SecurityPolicyInterface $policy, $sandboxed = false, SourcePolicyInterface $sourcePolicy = null) + public function __construct(SecurityPolicyInterface $policy, $sandboxed = false, ?SourcePolicyInterface $sourcePolicy = null) { $this->policy = $policy; $this->sandboxedGlobally = $sandboxed; @@ -53,7 +53,7 @@ final class SandboxExtension extends AbstractExtension $this->sandboxed = false; } - public function isSandboxed(Source $source = null): bool + public function isSandboxed(?Source $source = null): bool { return $this->sandboxedGlobally || $this->sandboxed || $this->isSourceSandboxed($source); } @@ -82,14 +82,14 @@ final class SandboxExtension extends AbstractExtension return $this->policy; } - public function checkSecurity($tags, $filters, $functions, Source $source = null): void + public function checkSecurity($tags, $filters, $functions, ?Source $source = null): void { if ($this->isSandboxed($source)) { $this->policy->checkSecurity($tags, $filters, $functions); } } - public function checkMethodAllowed($obj, $method, int $lineno = -1, Source $source = null): void + public function checkMethodAllowed($obj, $method, int $lineno = -1, ?Source $source = null): void { if ($this->isSandboxed($source)) { try { @@ -103,7 +103,7 @@ final class SandboxExtension extends AbstractExtension } } - public function checkPropertyAllowed($obj, $property, int $lineno = -1, Source $source = null): void + public function checkPropertyAllowed($obj, $property, int $lineno = -1, ?Source $source = null): void { if ($this->isSandboxed($source)) { try { @@ -117,7 +117,7 @@ final class SandboxExtension extends AbstractExtension } } - public function ensureToStringAllowed($obj, int $lineno = -1, Source $source = null) + public function ensureToStringAllowed($obj, int $lineno = -1, ?Source $source = null) { if ($this->isSandboxed($source) && \is_object($obj) && method_exists($obj, '__toString')) { try { diff --git a/src/Extension/StringLoaderExtension.php b/src/Extension/StringLoaderExtension.php index 9b25d9a55..0945678a8 100644 --- a/src/Extension/StringLoaderExtension.php +++ b/src/Extension/StringLoaderExtension.php @@ -34,7 +34,7 @@ final class StringLoaderExtension extends AbstractExtension * * @internal */ - public static function templateFromString(Environment $env, $template, string $name = null): TemplateWrapper + public static function templateFromString(Environment $env, $template, ?string $name = null): TemplateWrapper { return $env->createTemplate((string) $template, $name); } diff --git a/src/Loader/FilesystemLoader.php b/src/Loader/FilesystemLoader.php index 1b277fe2f..8472796f7 100644 --- a/src/Loader/FilesystemLoader.php +++ b/src/Loader/FilesystemLoader.php @@ -34,7 +34,7 @@ class FilesystemLoader implements LoaderInterface * @param string|array $paths A path or an array of paths where to look for templates * @param string|null $rootPath The root path common to all relative paths (null for getcwd()) */ - public function __construct($paths = [], string $rootPath = null) + public function __construct($paths = [], ?string $rootPath = null) { $this->rootPath = ($rootPath ?? getcwd()).\DIRECTORY_SEPARATOR; if (null !== $rootPath && false !== ($realPath = realpath($rootPath))) { diff --git a/src/Node/BlockNode.php b/src/Node/BlockNode.php index 241dff0b2..e20eae252 100644 --- a/src/Node/BlockNode.php +++ b/src/Node/BlockNode.php @@ -21,7 +21,7 @@ use Twig\Compiler; */ class BlockNode extends Node { - public function __construct(string $name, Node $body, int $lineno, string $tag = null) + public function __construct(string $name, Node $body, int $lineno, ?string $tag = null) { parent::__construct(['body' => $body], ['name' => $name], $lineno, $tag); } diff --git a/src/Node/BlockReferenceNode.php b/src/Node/BlockReferenceNode.php index 8b98c0f02..8abb6f954 100644 --- a/src/Node/BlockReferenceNode.php +++ b/src/Node/BlockReferenceNode.php @@ -21,7 +21,7 @@ use Twig\Compiler; */ class BlockReferenceNode extends Node implements NodeOutputInterface { - public function __construct(string $name, int $lineno, string $tag = null) + public function __construct(string $name, int $lineno, ?string $tag = null) { parent::__construct([], ['name' => $name], $lineno, $tag); } diff --git a/src/Node/CaptureNode.php b/src/Node/CaptureNode.php index cdb77e269..53ccce7f8 100644 --- a/src/Node/CaptureNode.php +++ b/src/Node/CaptureNode.php @@ -20,7 +20,7 @@ use Twig\Compiler; */ class CaptureNode extends Node { - public function __construct(Node $body, int $lineno, string $tag = null) + public function __construct(Node $body, int $lineno, ?string $tag = null) { parent::__construct(['body' => $body], ['raw' => false, 'with_blocks' => false], $lineno, $tag); } @@ -47,7 +47,7 @@ class CaptureNode extends Node if (!$this->getAttribute('raw')) { $compiler->raw(") ? '' : new Markup(\$tmp, \$this->env->getCharset())"); } - $compiler->raw(";"); + $compiler->raw(';'); return; } diff --git a/src/Node/DeprecatedNode.php b/src/Node/DeprecatedNode.php index 5ff44307f..ff9fcb4d6 100644 --- a/src/Node/DeprecatedNode.php +++ b/src/Node/DeprecatedNode.php @@ -22,7 +22,7 @@ use Twig\Node\Expression\ConstantExpression; */ class DeprecatedNode extends Node { - public function __construct(AbstractExpression $expr, int $lineno, string $tag = null) + public function __construct(AbstractExpression $expr, int $lineno, ?string $tag = null) { parent::__construct(['expr' => $expr], [], $lineno, $tag); } diff --git a/src/Node/DoNode.php b/src/Node/DoNode.php index f7783d19f..bf979dae7 100644 --- a/src/Node/DoNode.php +++ b/src/Node/DoNode.php @@ -21,7 +21,7 @@ use Twig\Node\Expression\AbstractExpression; */ class DoNode extends Node { - public function __construct(AbstractExpression $expr, int $lineno, string $tag = null) + public function __construct(AbstractExpression $expr, int $lineno, ?string $tag = null) { parent::__construct(['expr' => $expr], [], $lineno, $tag); } diff --git a/src/Node/EmbedNode.php b/src/Node/EmbedNode.php index 903c3f6c7..ce95f3a39 100644 --- a/src/Node/EmbedNode.php +++ b/src/Node/EmbedNode.php @@ -23,7 +23,7 @@ use Twig\Node\Expression\ConstantExpression; class EmbedNode extends IncludeNode { // we don't inject the module to avoid node visitors to traverse it twice (as it will be already visited in the main module) - public function __construct(string $name, int $index, ?AbstractExpression $variables, bool $only, bool $ignoreMissing, int $lineno, string $tag = null) + public function __construct(string $name, int $index, ?AbstractExpression $variables, bool $only, bool $ignoreMissing, int $lineno, ?string $tag = null) { parent::__construct(new ConstantExpression('not_used', $lineno), $variables, $only, $ignoreMissing, $lineno, $tag); diff --git a/src/Node/Expression/ArrayExpression.php b/src/Node/Expression/ArrayExpression.php index 075c13590..39b02f54e 100644 --- a/src/Node/Expression/ArrayExpression.php +++ b/src/Node/Expression/ArrayExpression.php @@ -55,7 +55,7 @@ class ArrayExpression extends AbstractExpression return false; } - public function addElement(AbstractExpression $value, AbstractExpression $key = null): void + public function addElement(AbstractExpression $value, ?AbstractExpression $key = null): void { if (null === $key) { $key = new ConstantExpression(++$this->index, $value->getTemplateLine()); diff --git a/src/Node/Expression/BlockReferenceExpression.php b/src/Node/Expression/BlockReferenceExpression.php index e63c5b214..9b187b924 100644 --- a/src/Node/Expression/BlockReferenceExpression.php +++ b/src/Node/Expression/BlockReferenceExpression.php @@ -22,7 +22,7 @@ use Twig\Node\Node; */ class BlockReferenceExpression extends AbstractExpression { - public function __construct(Node $name, ?Node $template, int $lineno, string $tag = null) + public function __construct(Node $name, ?Node $template, int $lineno, ?string $tag = null) { $nodes = ['name' => $name]; if (null !== $template) { diff --git a/src/Node/Expression/Filter/DefaultFilter.php b/src/Node/Expression/Filter/DefaultFilter.php index e8eae20ec..7eb0ea770 100644 --- a/src/Node/Expression/Filter/DefaultFilter.php +++ b/src/Node/Expression/Filter/DefaultFilter.php @@ -29,7 +29,7 @@ use Twig\Node\Node; */ class DefaultFilter extends FilterExpression { - public function __construct(Node $node, ConstantExpression $filterName, Node $arguments, int $lineno, string $tag = null) + public function __construct(Node $node, ConstantExpression $filterName, Node $arguments, int $lineno, ?string $tag = null) { $default = new FilterExpression($node, new ConstantExpression('default', $node->getTemplateLine()), $arguments, $node->getTemplateLine()); diff --git a/src/Node/Expression/FilterExpression.php b/src/Node/Expression/FilterExpression.php index 0fc158869..fec652a43 100644 --- a/src/Node/Expression/FilterExpression.php +++ b/src/Node/Expression/FilterExpression.php @@ -17,7 +17,7 @@ use Twig\Node\Node; class FilterExpression extends CallExpression { - public function __construct(Node $node, ConstantExpression $filterName, Node $arguments, int $lineno, string $tag = null) + public function __construct(Node $node, ConstantExpression $filterName, Node $arguments, int $lineno, ?string $tag = null) { parent::__construct(['node' => $node, 'filter' => $filterName, 'arguments' => $arguments], [], $lineno, $tag); } diff --git a/src/Node/Expression/ParentExpression.php b/src/Node/Expression/ParentExpression.php index 9dc27ed1a..22457cc3b 100644 --- a/src/Node/Expression/ParentExpression.php +++ b/src/Node/Expression/ParentExpression.php @@ -21,7 +21,7 @@ use Twig\Compiler; */ class ParentExpression extends AbstractExpression { - public function __construct(string $name, int $lineno, string $tag = null) + public function __construct(string $name, int $lineno, ?string $tag = null) { parent::__construct([], ['output' => false, 'name' => $name], $lineno, $tag); } diff --git a/src/Node/ForLoopNode.php b/src/Node/ForLoopNode.php index d5ce845a7..9120b962f 100644 --- a/src/Node/ForLoopNode.php +++ b/src/Node/ForLoopNode.php @@ -20,7 +20,7 @@ use Twig\Compiler; */ class ForLoopNode extends Node { - public function __construct(int $lineno, string $tag = null) + public function __construct(int $lineno, ?string $tag = null) { parent::__construct([], ['with_loop' => false, 'ifexpr' => false, 'else' => false], $lineno, $tag); } diff --git a/src/Node/ForNode.php b/src/Node/ForNode.php index 78b361d8a..f4df0c77d 100644 --- a/src/Node/ForNode.php +++ b/src/Node/ForNode.php @@ -25,7 +25,7 @@ class ForNode extends Node { private $loop; - public function __construct(AssignNameExpression $keyTarget, AssignNameExpression $valueTarget, AbstractExpression $seq, ?Node $ifexpr, Node $body, ?Node $else, int $lineno, string $tag = null) + public function __construct(AssignNameExpression $keyTarget, AssignNameExpression $valueTarget, AbstractExpression $seq, ?Node $ifexpr, Node $body, ?Node $else, int $lineno, ?string $tag = null) { $body = new Node([$body, $this->loop = new ForLoopNode($lineno, $tag)]); diff --git a/src/Node/IfNode.php b/src/Node/IfNode.php index b41ee828d..940e5deab 100644 --- a/src/Node/IfNode.php +++ b/src/Node/IfNode.php @@ -21,7 +21,7 @@ use Twig\Compiler; */ class IfNode extends Node { - public function __construct(Node $tests, ?Node $else, int $lineno, string $tag = null) + public function __construct(Node $tests, ?Node $else, int $lineno, ?string $tag = null) { $nodes = ['tests' => $tests]; if (null !== $else) { diff --git a/src/Node/ImportNode.php b/src/Node/ImportNode.php index 5378d799e..1a3494c91 100644 --- a/src/Node/ImportNode.php +++ b/src/Node/ImportNode.php @@ -22,7 +22,7 @@ use Twig\Node\Expression\NameExpression; */ class ImportNode extends Node { - public function __construct(AbstractExpression $expr, AbstractExpression $var, int $lineno, string $tag = null, bool $global = true) + public function __construct(AbstractExpression $expr, AbstractExpression $var, int $lineno, ?string $tag = null, bool $global = true) { parent::__construct(['expr' => $expr, 'var' => $var], ['global' => $global], $lineno, $tag); } diff --git a/src/Node/IncludeNode.php b/src/Node/IncludeNode.php index 35f5fa31b..09c6622ec 100644 --- a/src/Node/IncludeNode.php +++ b/src/Node/IncludeNode.php @@ -22,7 +22,7 @@ use Twig\Node\Expression\AbstractExpression; */ class IncludeNode extends Node implements NodeOutputInterface { - public function __construct(AbstractExpression $expr, ?AbstractExpression $variables, bool $only, bool $ignoreMissing, int $lineno, string $tag = null) + public function __construct(AbstractExpression $expr, ?AbstractExpression $variables, bool $only, bool $ignoreMissing, int $lineno, ?string $tag = null) { $nodes = ['expr' => $expr]; if (null !== $variables) { diff --git a/src/Node/MacroNode.php b/src/Node/MacroNode.php index 63fb8dea5..ae62a22b5 100644 --- a/src/Node/MacroNode.php +++ b/src/Node/MacroNode.php @@ -23,7 +23,7 @@ class MacroNode extends Node { public const VARARGS_NAME = 'varargs'; - public function __construct(string $name, Node $body, Node $arguments, int $lineno, string $tag = null) + public function __construct(string $name, Node $body, Node $arguments, int $lineno, ?string $tag = null) { foreach ($arguments as $argumentName => $argument) { if (self::VARARGS_NAME === $argumentName) { diff --git a/src/Node/Node.php b/src/Node/Node.php index 30659ae0f..7b90b6092 100644 --- a/src/Node/Node.php +++ b/src/Node/Node.php @@ -35,7 +35,7 @@ class Node implements \Countable, \IteratorAggregate * @param int $lineno The line number * @param string $tag The tag name associated with the Node */ - public function __construct(array $nodes = [], array $attributes = [], int $lineno = 0, string $tag = null) + public function __construct(array $nodes = [], array $attributes = [], int $lineno = 0, ?string $tag = null) { foreach ($nodes as $name => $node) { if (!$node instanceof self) { diff --git a/src/Node/PrintNode.php b/src/Node/PrintNode.php index 36bcaee64..369995f5c 100644 --- a/src/Node/PrintNode.php +++ b/src/Node/PrintNode.php @@ -22,7 +22,7 @@ use Twig\Node\Expression\AbstractExpression; */ class PrintNode extends Node implements NodeOutputInterface { - public function __construct(AbstractExpression $expr, int $lineno, string $tag = null) + public function __construct(AbstractExpression $expr, int $lineno, ?string $tag = null) { parent::__construct(['expr' => $expr], [], $lineno, $tag); } diff --git a/src/Node/SandboxNode.php b/src/Node/SandboxNode.php index 4d5666bff..0ffef6dbb 100644 --- a/src/Node/SandboxNode.php +++ b/src/Node/SandboxNode.php @@ -20,7 +20,7 @@ use Twig\Compiler; */ class SandboxNode extends Node { - public function __construct(Node $body, int $lineno, string $tag = null) + public function __construct(Node $body, int $lineno, ?string $tag = null) { parent::__construct(['body' => $body], [], $lineno, $tag); } diff --git a/src/Node/SetNode.php b/src/Node/SetNode.php index 4057c6a75..7dea50023 100644 --- a/src/Node/SetNode.php +++ b/src/Node/SetNode.php @@ -21,7 +21,7 @@ use Twig\Node\Expression\ConstantExpression; */ class SetNode extends Node implements NodeCaptureInterface { - public function __construct(bool $capture, Node $names, Node $values, int $lineno, string $tag = null) + public function __construct(bool $capture, Node $names, Node $values, int $lineno, ?string $tag = null) { /* * Optimizes the node when capture is used for a large block of text. diff --git a/src/Node/WithNode.php b/src/Node/WithNode.php index 302b40389..3dd2b07ec 100644 --- a/src/Node/WithNode.php +++ b/src/Node/WithNode.php @@ -20,7 +20,7 @@ use Twig\Compiler; */ class WithNode extends Node { - public function __construct(Node $body, ?Node $variables, bool $only, int $lineno, string $tag = null) + public function __construct(Node $body, ?Node $variables, bool $only, int $lineno, ?string $tag = null) { $nodes = ['body' => $body]; if (null !== $variables) { diff --git a/src/NodeVisitor/OptimizerNodeVisitor.php b/src/NodeVisitor/OptimizerNodeVisitor.php index 9f9b81cbf..6af056ac4 100644 --- a/src/NodeVisitor/OptimizerNodeVisitor.php +++ b/src/NodeVisitor/OptimizerNodeVisitor.php @@ -137,7 +137,7 @@ final class OptimizerNodeVisitor implements NodeVisitorInterface $exprNode = $node->getNode('expr'); - if ($exprNode instanceof ConstantExpression && is_string($exprNode->getAttribute('value'))) { + if ($exprNode instanceof ConstantExpression && \is_string($exprNode->getAttribute('value'))) { return new TextNode($exprNode->getAttribute('value'), $exprNode->getTemplateLine()); } diff --git a/src/NodeVisitor/SafeAnalysisNodeVisitor.php b/src/NodeVisitor/SafeAnalysisNodeVisitor.php index 90d6f2e0f..6df046e1c 100644 --- a/src/NodeVisitor/SafeAnalysisNodeVisitor.php +++ b/src/NodeVisitor/SafeAnalysisNodeVisitor.php @@ -136,7 +136,7 @@ final class SafeAnalysisNodeVisitor implements NodeVisitorInterface return $node; } - private function intersectSafe(array $a = null, array $b = null): array + private function intersectSafe(?array $a = null, ?array $b = null): array { if (null === $a || null === $b) { return []; diff --git a/src/Parser.php b/src/Parser.php index 0c7629b55..adcaee316 100644 --- a/src/Parser.php +++ b/src/Parser.php @@ -250,7 +250,7 @@ class Parser $this->embeddedTemplates[] = $template; } - public function addImportedSymbol(string $type, string $alias, string $name = null, AbstractExpression $node = null): void + public function addImportedSymbol(string $type, string $alias, ?string $name = null, ?AbstractExpression $node = null): void { $this->importedSymbols[0][$type][$alias] = ['name' => $name, 'node' => $node]; } diff --git a/src/Resources/string_loader.php b/src/Resources/string_loader.php index b074495ca..af5e152b2 100644 --- a/src/Resources/string_loader.php +++ b/src/Resources/string_loader.php @@ -15,9 +15,10 @@ use Twig\TemplateWrapper; /** * @internal + * * @deprecated since Twig 3.9.0 */ -function twig_template_from_string(Environment $env, $template, string $name = null): TemplateWrapper +function twig_template_from_string(Environment $env, $template, ?string $name = null): TemplateWrapper { trigger_deprecation('twig/twig', '3.9.0', 'Using the internal "%s" function is deprecated.', __FUNCTION__); diff --git a/src/Template.php b/src/Template.php index a45bf6e1e..0c06ac918 100644 --- a/src/Template.php +++ b/src/Template.php @@ -148,7 +148,7 @@ abstract class Template * @param array $blocks The current set of blocks * @param bool $useBlocks Whether to use the current set of blocks */ - public function displayBlock($name, array $context, array $blocks = [], $useBlocks = true, self $templateContext = null) + public function displayBlock($name, array $context, array $blocks = [], $useBlocks = true, ?self $templateContext = null) { if ($useBlocks && isset($blocks[$name])) { $template = $blocks[$name][0]; diff --git a/src/Test/NodeTestCase.php b/src/Test/NodeTestCase.php index 8df0e9fee..b4ddafe75 100644 --- a/src/Test/NodeTestCase.php +++ b/src/Test/NodeTestCase.php @@ -34,7 +34,7 @@ abstract class NodeTestCase extends TestCase $this->assertNodeCompilation($source, $node, $environment, $isPattern); } - public function assertNodeCompilation($source, Node $node, Environment $environment = null, $isPattern = false) + public function assertNodeCompilation($source, Node $node, ?Environment $environment = null, $isPattern = false) { $compiler = $this->getCompiler($environment); $compiler->compile($node); @@ -46,7 +46,7 @@ abstract class NodeTestCase extends TestCase } } - protected function getCompiler(Environment $environment = null) + protected function getCompiler(?Environment $environment = null) { return new Compiler($environment ?? $this->getEnvironment()); } diff --git a/src/TokenStream.php b/src/TokenStream.php index cb578e4fc..89e7e0f3f 100644 --- a/src/TokenStream.php +++ b/src/TokenStream.php @@ -25,7 +25,7 @@ final class TokenStream private $current = 0; private $source; - public function __construct(array $tokens, Source $source = null) + public function __construct(array $tokens, ?Source $source = null) { $this->tokens = $tokens; $this->source = $source ?: new Source('', ''); @@ -66,7 +66,7 @@ final class TokenStream /** * Tests a token and returns it or throws a syntax error. */ - public function expect($type, $value = null, string $message = null): Token + public function expect($type, $value = null, ?string $message = null): Token { $token = $this->tokens[$this->current]; if (!$token->test($type, $value)) { diff --git a/src/YieldingTemplate.php b/src/YieldingTemplate.php index 93ee894d2..c9d7a578b 100644 --- a/src/YieldingTemplate.php +++ b/src/YieldingTemplate.php @@ -71,7 +71,7 @@ abstract class YieldingTemplate extends Template /** * @return iterable */ - public function yieldBlock($name, array $context, array $blocks = [], $useBlocks = true, Template $templateContext = null) + public function yieldBlock($name, array $context, array $blocks = [], $useBlocks = true, ?Template $templateContext = null) { if ($useBlocks && isset($blocks[$name])) { $template = $blocks[$name][0]; @@ -165,7 +165,7 @@ abstract class YieldingTemplate extends Template return $content; } - public function displayBlock($name, array $context, array $blocks = [], $useBlocks = true, Template $templateContext = null) + public function displayBlock($name, array $context, array $blocks = [], $useBlocks = true, ?Template $templateContext = null) { throw new RuntimeError(sprintf('Calling "%s" for block "%s" is not supported as "use_yield" is set to "true".', __METHOD__, $name), -1, $this->getSourceContext()); } diff --git a/tests/Node/BlockTest.php b/tests/Node/BlockTest.php index cdc2c861c..a02114566 100644 --- a/tests/Node/BlockTest.php +++ b/tests/Node/BlockTest.php @@ -42,7 +42,7 @@ public function block_foo(\$context, array \$blocks = []) echo "foo"; } EOF - , new Environment(new ArrayLoader()) + , new Environment(new ArrayLoader()), ]; } else { $tests[] = [new BlockNode('foo', new TextNode('foo', 1), 1), <<