mirror of
https://github.com/twigphp/Twig.git
synced 2026-08-31 04:27:00 +00:00
removed fn in front of arrow functions
This commit is contained in:
@@ -11,7 +11,7 @@ function. The arrow function receives the value of the sequence or mapping:
|
||||
|
||||
{% set sizes = [34, 36, 38, 40, 42] %}
|
||||
|
||||
{% for v in sizes|filter(|v| => v > 38) -%}
|
||||
{% for v in sizes|filter(v => v > 38) -%}
|
||||
{{ v }}
|
||||
{% endfor %}
|
||||
{# output 40 42 #}
|
||||
@@ -24,7 +24,7 @@ function. The arrow function receives the value of the sequence or mapping:
|
||||
xl: 42,
|
||||
} %}
|
||||
|
||||
{% for k, v in sizes|filter(|v| => v > 38) -%}
|
||||
{% for k, v in sizes|filter(v => v > 38) -%}
|
||||
{{ k }} = {{ v }}
|
||||
{% endfor %}
|
||||
{# output l = 40 xl = 42 #}
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@ mapping. The arrow function receives the value of the sequence or mapping:
|
||||
{first: "Alice", last: "Dupond"},
|
||||
] %}
|
||||
|
||||
{{ people|map(|p| => "#{p.first} #{p.last}")|join(', ') }}
|
||||
{{ people|map(p => "#{p.first} #{p.last}")|join(', ') }}
|
||||
{# outputs Bob Smith, Alice Dupond #}
|
||||
|
||||
Note that the arrow function has access to the current context.
|
||||
|
||||
@@ -13,14 +13,14 @@ value of the sequence or mapping:
|
||||
|
||||
{% set numbers = [1, 2, 3] %}
|
||||
|
||||
{{ numbers|reduce(|carry, v| => carry + v) }}
|
||||
{{ numbers|reduce((carry, v) => carry + v) }}
|
||||
{# output 6 #}
|
||||
|
||||
The ``reduce`` filter takes an ``initial`` value as a second argument:
|
||||
|
||||
.. code-block:: twig
|
||||
|
||||
{{ numbers|reduce(|carry, v| => carry + v, 10) }}
|
||||
{{ numbers|reduce((carry, v) => carry + v, 10) }}
|
||||
{# output 16 #}
|
||||
|
||||
Note that the arrow function has access to the current context.
|
||||
|
||||
@@ -109,22 +109,47 @@ class ExpressionParser
|
||||
private function parseArrow()
|
||||
{
|
||||
$stream = $this->parser->getStream();
|
||||
$token = $this->parser->getCurrentToken();
|
||||
$line = $token->getLine();
|
||||
if (!$token->test(Token::NAME_TYPE, 'fn')) {
|
||||
|
||||
// short array syntax (one argument, no parentheses)?
|
||||
if ($stream->look(1)->test(Token::ARROW_TYPE)) {
|
||||
$line = $stream->getCurrent()->getLine();
|
||||
$token = $stream->expect(Token::NAME_TYPE);
|
||||
$names = [new AssignNameExpression($token->getValue(), $token->getLine())];
|
||||
$stream->expect(Token::ARROW_TYPE);
|
||||
|
||||
return new ArrowFunctionExpression($this->parseExpression(0), new Node($names), $line);
|
||||
}
|
||||
|
||||
// first, determine if we are parsing an arrow function by finding => (long form)
|
||||
$i = 0;
|
||||
if (!$stream->look($i)->test(Token::PUNCTUATION_TYPE, '(')) {
|
||||
return null;
|
||||
}
|
||||
if ($stream->look(2)->test(Token::PUNCTUATION_TYPE, '(')) {
|
||||
++$i;
|
||||
while (true) {
|
||||
// variable name
|
||||
++$i;
|
||||
if (!$stream->look($i)->test(Token::PUNCTUATION_TYPE, ',')) {
|
||||
break;
|
||||
}
|
||||
++$i;
|
||||
}
|
||||
if (!$stream->look($i)->test(Token::PUNCTUATION_TYPE, ')')) {
|
||||
return null;
|
||||
}
|
||||
++$i;
|
||||
if (!$stream->look($i)->test(Token::ARROW_TYPE)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$stream->next(); // fn
|
||||
$stream->next(); // (
|
||||
// yes, let's parse it properly
|
||||
$token = $stream->expect(Token::PUNCTUATION_TYPE, '(');
|
||||
$line = $token->getLine();
|
||||
|
||||
$names = [];
|
||||
while (true) {
|
||||
$token = $stream->expect(Token::NAME_TYPE);
|
||||
$value = $token->getValue();
|
||||
$names[] = new AssignNameExpression($value, $token->getLine());
|
||||
$names[] = new AssignNameExpression($token->getValue(), $token->getLine());
|
||||
|
||||
if (!$stream->nextIf(Token::PUNCTUATION_TYPE, ',')) {
|
||||
break;
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
--TEST--
|
||||
A string in parentheses cannot be confused with an arrow function
|
||||
--TEMPLATE--
|
||||
{{ ["foo", "bar"]|join(("f")) }}
|
||||
--DATA--
|
||||
return []
|
||||
--EXPECT--
|
||||
foofbar
|
||||
@@ -3,10 +3,15 @@
|
||||
--TEMPLATE--
|
||||
{% set offset = 3 %}
|
||||
|
||||
{% for k, v in [1, 5, 3, 4, 5]|filter(fn(v) => v > offset) -%}
|
||||
{% for k, v in [1, 5, 3, 4, 5]|filter((v) => v > offset) -%}
|
||||
{{ k }} = {{ v }}
|
||||
{% endfor %}
|
||||
{% for k, v in {a: 1, b: 2, c: 5, d: 2}|filter(fn(v) => v > offset) -%}
|
||||
|
||||
{% for k, v in {a: 1, b: 2, c: 5, d: 2}|filter((v) => v > offset) -%}
|
||||
{{ k }} = {{ v }}
|
||||
{% endfor %}
|
||||
|
||||
{% for k, v in [1, 5, 3, 4, 5]|filter(v => v > offset) -%}
|
||||
{{ k }} = {{ v }}
|
||||
{% endfor %}
|
||||
--DATA--
|
||||
@@ -15,4 +20,9 @@ return []
|
||||
1 = 5
|
||||
3 = 4
|
||||
4 = 5
|
||||
|
||||
c = 5
|
||||
|
||||
1 = 5
|
||||
3 = 4
|
||||
4 = 5
|
||||
|
||||
@@ -3,10 +3,15 @@
|
||||
--TEMPLATE--
|
||||
{% set offset = 3 %}
|
||||
|
||||
{% for k, v in [1, 2]|map(fn(item) => item + 2 ) -%}
|
||||
{% for k, v in [1, 2]|map((item) => item + 2 ) -%}
|
||||
{{ k }} = {{ v }}
|
||||
{% endfor %}
|
||||
{% for k, v in {a: 1, b: 2}|map(fn(item) => item ~ "*" ) -%}
|
||||
|
||||
{% for k, v in {a: 1, b: 2}|map((item) => item ~ "*" ) -%}
|
||||
{{ k }} = {{ v }}
|
||||
{% endfor %}
|
||||
|
||||
{% for k, v in [1, 2]|map(item => item + 2 ) -%}
|
||||
{{ k }} = {{ v }}
|
||||
{% endfor %}
|
||||
--DATA--
|
||||
@@ -14,5 +19,9 @@ return []
|
||||
--EXPECT--
|
||||
0 = 3
|
||||
1 = 4
|
||||
|
||||
a = 1*
|
||||
b = 2*
|
||||
|
||||
0 = 3
|
||||
1 = 4
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
--TEMPLATE--
|
||||
{% set offset = 3 %}
|
||||
|
||||
{{ [1, -1, 4]|reduce(fn(carry, item) => carry + item + offset, 10) }}
|
||||
{{ [1, -1, 4]|reduce((carry, item) => carry + item + offset, 10) }}
|
||||
--DATA--
|
||||
return []
|
||||
--EXPECT--
|
||||
|
||||
Reference in New Issue
Block a user