diff --git a/CHANGELOG b/CHANGELOG index 8eb9dc4ec..6c3bb715f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,6 +4,7 @@ * Remove support for calling `TemplateWrapper::unwrap()` without an environment argument * Stop detecting `echo` and `print` in compiled nodes; `yield` is the only supported mode and 3.x deprecates the alternative * Remove the now inert `#[YieldReady]` attribute from the built-in nodes; the attribute itself is kept so 3.x extensions still load + * Remove the now inert `#[FirstClassTwigCallableReady]` attribute from the built-in nodes; the attribute itself is kept so 3.x extensions still load * Add an optional `string $template = ''` argument to `IncludeNode::addGetTemplate()`; subclasses overriding this method must declare a compatible parameter * Remove the obsolete `Twig\Test\NodeTestCase::getTests()` method; override `provideTests()` instead * Make `Twig\Markup` final diff --git a/src/Attribute/FirstClassTwigCallableReady.php b/src/Attribute/FirstClassTwigCallableReady.php index ffd8cffc8..f9707a901 100644 --- a/src/Attribute/FirstClassTwigCallableReady.php +++ b/src/Attribute/FirstClassTwigCallableReady.php @@ -13,6 +13,10 @@ namespace Twig\Attribute; /** * Marks nodes that are ready to accept a TwigCallable instead of its name. + * + * Starting from Twig v4, all nodes must accept a TwigCallable, so this + * attribute doesn't lead to any specific behavior. It still exists to help + * projects move from Twig v3 to v4. */ #[\Attribute(\Attribute::TARGET_METHOD)] final class FirstClassTwigCallableReady diff --git a/src/Node/Expression/Filter/DefaultFilter.php b/src/Node/Expression/Filter/DefaultFilter.php index 99157f040..724cd0ff2 100644 --- a/src/Node/Expression/Filter/DefaultFilter.php +++ b/src/Node/Expression/Filter/DefaultFilter.php @@ -11,7 +11,6 @@ namespace Twig\Node\Expression\Filter; -use Twig\Attribute\FirstClassTwigCallableReady; use Twig\Compiler; use Twig\Node\EmptyNode; use Twig\Node\Expression\AbstractExpression; @@ -34,7 +33,6 @@ use Twig\TwigTest; */ class DefaultFilter extends FilterExpression { - #[FirstClassTwigCallableReady] public function __construct(AbstractExpression $node, TwigFilter $filter, Node $arguments, int $lineno) { $name = $filter->getName(); diff --git a/src/Node/Expression/Filter/EscapeFilter.php b/src/Node/Expression/Filter/EscapeFilter.php index c4b5bd985..bbc51c0c0 100644 --- a/src/Node/Expression/Filter/EscapeFilter.php +++ b/src/Node/Expression/Filter/EscapeFilter.php @@ -11,7 +11,6 @@ namespace Twig\Node\Expression\Filter; -use Twig\Attribute\FirstClassTwigCallableReady; use Twig\Compiler; use Twig\Node\Expression\AbstractExpression; use Twig\Node\Expression\FilterExpression; @@ -25,7 +24,6 @@ use Twig\TwigFilter; */ final class EscapeFilter extends FilterExpression { - #[FirstClassTwigCallableReady] public function __construct(AbstractExpression $node, TwigFilter $filter, Node $arguments, int $lineno) { parent::__construct($node, $filter, $arguments, $lineno); diff --git a/src/Node/Expression/Filter/RawFilter.php b/src/Node/Expression/Filter/RawFilter.php index 882928f3f..19e4423fc 100644 --- a/src/Node/Expression/Filter/RawFilter.php +++ b/src/Node/Expression/Filter/RawFilter.php @@ -11,7 +11,6 @@ namespace Twig\Node\Expression\Filter; -use Twig\Attribute\FirstClassTwigCallableReady; use Twig\Compiler; use Twig\Node\EmptyNode; use Twig\Node\Expression\AbstractExpression; @@ -24,7 +23,6 @@ use Twig\TwigFilter; */ class RawFilter extends FilterExpression { - #[FirstClassTwigCallableReady] public function __construct(AbstractExpression $node, ?TwigFilter $filter = null, ?Node $arguments = null, int $lineno = 0) { parent::__construct($node, $filter ?: new TwigFilter('raw', null, ['is_safe' => ['all']]), $arguments ?: new EmptyNode(), $lineno ?: $node->getTemplateLine()); diff --git a/src/Node/Expression/FilterExpression.php b/src/Node/Expression/FilterExpression.php index ec4ab2d15..7ed854f61 100644 --- a/src/Node/Expression/FilterExpression.php +++ b/src/Node/Expression/FilterExpression.php @@ -12,14 +12,12 @@ namespace Twig\Node\Expression; -use Twig\Attribute\FirstClassTwigCallableReady; use Twig\Node\CoercesChildrenToStringInterface; use Twig\Node\Node; use Twig\TwigFilter; class FilterExpression extends CallExpression implements CoercesChildrenToStringInterface { - #[FirstClassTwigCallableReady] public function __construct(AbstractExpression $node, TwigFilter $filter, Node $arguments, int $lineno) { parent::__construct(['node' => $node, 'arguments' => $arguments], ['name' => $filter->getName(), 'type' => 'filter', 'twig_callable' => $filter], $lineno); diff --git a/src/Node/Expression/FunctionExpression.php b/src/Node/Expression/FunctionExpression.php index e25e3d341..2f9aac7ab 100644 --- a/src/Node/Expression/FunctionExpression.php +++ b/src/Node/Expression/FunctionExpression.php @@ -11,7 +11,6 @@ namespace Twig\Node\Expression; -use Twig\Attribute\FirstClassTwigCallableReady; use Twig\Compiler; use Twig\Node\CoercesChildrenToStringInterface; use Twig\Node\Node; @@ -21,7 +20,6 @@ class FunctionExpression extends CallExpression implements SupportDefinedTestInt { use SupportDefinedTestTrait; - #[FirstClassTwigCallableReady] public function __construct(TwigFunction $function, Node $arguments, int $lineno) { parent::__construct(['arguments' => $arguments], ['name' => $function->getName(), 'type' => 'function', 'twig_callable' => $function], $lineno); diff --git a/src/Node/Expression/Test/DefinedTest.php b/src/Node/Expression/Test/DefinedTest.php index a097791d2..0e3ba9d56 100644 --- a/src/Node/Expression/Test/DefinedTest.php +++ b/src/Node/Expression/Test/DefinedTest.php @@ -11,7 +11,6 @@ namespace Twig\Node\Expression\Test; -use Twig\Attribute\FirstClassTwigCallableReady; use Twig\Compiler; use Twig\Error\SyntaxError; use Twig\Node\Expression\AbstractExpression; @@ -32,7 +31,6 @@ use Twig\TwigTest; */ class DefinedTest extends TestExpression { - #[FirstClassTwigCallableReady] public function __construct(AbstractExpression $node, TwigTest $name, ?Node $arguments, int $lineno) { if (!$node instanceof SupportDefinedTestInterface) { diff --git a/src/Node/Expression/TestExpression.php b/src/Node/Expression/TestExpression.php index 06a2d1fdf..b843f59a0 100644 --- a/src/Node/Expression/TestExpression.php +++ b/src/Node/Expression/TestExpression.php @@ -11,7 +11,6 @@ namespace Twig\Node\Expression; -use Twig\Attribute\FirstClassTwigCallableReady; use Twig\Node\CoercesChildrenToStringInterface; use Twig\Node\EmptyNode; use Twig\Node\Node; @@ -19,7 +18,6 @@ use Twig\TwigTest; class TestExpression extends CallExpression implements ReturnBoolInterface, CoercesChildrenToStringInterface { - #[FirstClassTwigCallableReady] public function __construct(AbstractExpression $node, TwigTest $test, ?Node $arguments, int $lineno) { parent::__construct(['node' => $node, 'arguments' => $arguments ?: new EmptyNode()], ['name' => $test->getName(), 'type' => 'test', 'twig_callable' => $test], $lineno);