@@ -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 ;
0 commit comments