Skip to content

Commit 175041e

Browse files
committed
removed fn in front of arrow functions
1 parent dc27763 commit 175041e

8 files changed

Lines changed: 70 additions & 18 deletions

File tree

doc/filters/filter.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ function. The arrow function receives the value of the sequence or mapping:
1111
1212
{% set sizes = [34, 36, 38, 40, 42] %}
1313
14-
{% for v in sizes|filter(|v| => v > 38) -%}
14+
{% for v in sizes|filter(v => v > 38) -%}
1515
{{ v }}
1616
{% endfor %}
1717
{# output 40 42 #}
@@ -24,7 +24,7 @@ function. The arrow function receives the value of the sequence or mapping:
2424
xl: 42,
2525
} %}
2626
27-
{% for k, v in sizes|filter(|v| => v > 38) -%}
27+
{% for k, v in sizes|filter(v => v > 38) -%}
2828
{{ k }} = {{ v }}
2929
{% endfor %}
3030
{# output l = 40 xl = 42 #}

doc/filters/map.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ mapping. The arrow function receives the value of the sequence or mapping:
1414
{first: "Alice", last: "Dupond"},
1515
] %}
1616
17-
{{ people|map(|p| => "#{p.first} #{p.last}")|join(', ') }}
17+
{{ people|map(p => "#{p.first} #{p.last}")|join(', ') }}
1818
{# outputs Bob Smith, Alice Dupond #}
1919
2020
Note that the arrow function has access to the current context.

doc/filters/reduce.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ value of the sequence or mapping:
1313
1414
{% set numbers = [1, 2, 3] %}
1515
16-
{{ numbers|reduce(|carry, v| => carry + v) }}
16+
{{ numbers|reduce((carry, v) => carry + v) }}
1717
{# output 6 #}
1818
1919
The ``reduce`` filter takes an ``initial`` value as a second argument:
2020

2121
.. code-block:: twig
2222
23-
{{ numbers|reduce(|carry, v| => carry + v, 10) }}
23+
{{ numbers|reduce((carry, v) => carry + v, 10) }}
2424
{# output 16 #}
2525
2626
Note that the arrow function has access to the current context.

src/ExpressionParser.php

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -109,22 +109,47 @@ public function parseExpression($precedence = 0, $allowArrow = false)
109109
private function parseArrow()
110110
{
111111
$stream = $this->parser->getStream();
112-
$token = $this->parser->getCurrentToken();
113-
$line = $token->getLine();
114-
if (!$token->test(Token::NAME_TYPE, 'fn')) {
112+
113+
// short array syntax (one argument, no parentheses)?
114+
if ($stream->look(1)->test(Token::ARROW_TYPE)) {
115+
$line = $stream->getCurrent()->getLine();
116+
$token = $stream->expect(Token::NAME_TYPE);
117+
$names = [new AssignNameExpression($token->getValue(), $token->getLine())];
118+
$stream->expect(Token::ARROW_TYPE);
119+
120+
return new ArrowFunctionExpression($this->parseExpression(0), new Node($names), $line);
121+
}
122+
123+
// first, determine if we are parsing an arrow function by finding => (long form)
124+
$i = 0;
125+
if (!$stream->look($i)->test(Token::PUNCTUATION_TYPE, '(')) {
126+
return null;
127+
}
128+
++$i;
129+
while (true) {
130+
// variable name
131+
++$i;
132+
if (!$stream->look($i)->test(Token::PUNCTUATION_TYPE, ',')) {
133+
break;
134+
}
135+
++$i;
136+
}
137+
if (!$stream->look($i)->test(Token::PUNCTUATION_TYPE, ')')) {
115138
return null;
116139
}
117-
if ($stream->look(2)->test(Token::PUNCTUATION_TYPE, '(')) {
140+
++$i;
141+
if (!$stream->look($i)->test(Token::ARROW_TYPE)) {
118142
return null;
119143
}
120144

121-
$stream->next(); // fn
122-
$stream->next(); // (
145+
// yes, let's parse it properly
146+
$token = $stream->expect(Token::PUNCTUATION_TYPE, '(');
147+
$line = $token->getLine();
148+
123149
$names = [];
124150
while (true) {
125151
$token = $stream->expect(Token::NAME_TYPE);
126-
$value = $token->getValue();
127-
$names[] = new AssignNameExpression($value, $token->getLine());
152+
$names[] = new AssignNameExpression($token->getValue(), $token->getLine());
128153

129154
if (!$stream->nextIf(Token::PUNCTUATION_TYPE, ',')) {
130155
break;
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
--TEST--
2+
A string in parentheses cannot be confused with an arrow function
3+
--TEMPLATE--
4+
{{ ["foo", "bar"]|join(("f")) }}
5+
--DATA--
6+
return []
7+
--EXPECT--
8+
foofbar

test/Twig/Tests/Fixtures/filters/filter.test

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,15 @@
33
--TEMPLATE--
44
{% set offset = 3 %}
55

6-
{% for k, v in [1, 5, 3, 4, 5]|filter(fn(v) => v > offset) -%}
6+
{% for k, v in [1, 5, 3, 4, 5]|filter((v) => v > offset) -%}
77
{{ k }} = {{ v }}
88
{% endfor %}
9-
{% for k, v in {a: 1, b: 2, c: 5, d: 2}|filter(fn(v) => v > offset) -%}
9+
10+
{% for k, v in {a: 1, b: 2, c: 5, d: 2}|filter((v) => v > offset) -%}
11+
{{ k }} = {{ v }}
12+
{% endfor %}
13+
14+
{% for k, v in [1, 5, 3, 4, 5]|filter(v => v > offset) -%}
1015
{{ k }} = {{ v }}
1116
{% endfor %}
1217
--DATA--
@@ -15,4 +20,9 @@ return []
1520
1 = 5
1621
3 = 4
1722
4 = 5
23+
1824
c = 5
25+
26+
1 = 5
27+
3 = 4
28+
4 = 5

test/Twig/Tests/Fixtures/filters/map.test

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,25 @@
33
--TEMPLATE--
44
{% set offset = 3 %}
55

6-
{% for k, v in [1, 2]|map(fn(item) => item + 2 ) -%}
6+
{% for k, v in [1, 2]|map((item) => item + 2 ) -%}
77
{{ k }} = {{ v }}
88
{% endfor %}
9-
{% for k, v in {a: 1, b: 2}|map(fn(item) => item ~ "*" ) -%}
9+
10+
{% for k, v in {a: 1, b: 2}|map((item) => item ~ "*" ) -%}
11+
{{ k }} = {{ v }}
12+
{% endfor %}
13+
14+
{% for k, v in [1, 2]|map(item => item + 2 ) -%}
1015
{{ k }} = {{ v }}
1116
{% endfor %}
1217
--DATA--
1318
return []
1419
--EXPECT--
1520
0 = 3
1621
1 = 4
22+
1723
a = 1*
1824
b = 2*
25+
26+
0 = 3
27+
1 = 4

test/Twig/Tests/Fixtures/filters/reduce.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
--TEMPLATE--
44
{% set offset = 3 %}
55

6-
{{ [1, -1, 4]|reduce(fn(carry, item) => carry + item + offset, 10) }}
6+
{{ [1, -1, 4]|reduce((carry, item) => carry + item + offset, 10) }}
77
--DATA--
88
return []
99
--EXPECT--

0 commit comments

Comments
 (0)