11import { FIELD , int , isBlank , BaseException , StringWrapper } from 'facade/lang' ;
22import { ListWrapper , List } from 'facade/collection' ;
3- import { Lexer , EOF , Token , $PERIOD , $COLON , $SEMICOLON , $LBRACKET , $RBRACKET , $COMMA , $LBRACE , $RBRACE } from './lexer' ;
3+ import { Lexer , EOF , Token , $PERIOD , $COLON , $SEMICOLON , $LBRACKET , $RBRACKET ,
4+ $COMMA , $LBRACE , $RBRACE , $LPAREN , $RPAREN } from './lexer' ;
45import { ClosureMap } from './closure_map' ;
56import {
67 AST ,
@@ -16,7 +17,9 @@ import {
1617 Chain ,
1718 KeyedAccess ,
1819 LiteralArray ,
19- LiteralMap
20+ LiteralMap ,
21+ MethodCall ,
22+ FunctionCall
2023 } from './ast' ;
2124
2225var _implicitReceiver = new ImplicitReceiver ( ) ;
@@ -273,21 +276,26 @@ class _ParseAST {
273276 } else if ( this . optionalOperator ( '!' ) ) {
274277 return new PrefixNot ( this . parsePrefix ( ) ) ;
275278 } else {
276- return this . parseAccessOrCallMember ( ) ;
279+ return this . parseCallChain ( ) ;
277280 }
278281 }
279282
280- parseAccessOrCallMember ( ) :AST {
283+ parseCallChain ( ) :AST {
281284 var result = this . parsePrimary ( ) ;
282285 while ( true ) {
283286 if ( this . optionalCharacter ( $PERIOD ) ) {
284- result = this . parseFieldRead ( result ) ;
287+ result = this . parseAccessorOrMethodCall ( result ) ;
285288
286289 } else if ( this . optionalCharacter ( $LBRACKET ) ) {
287290 var key = this . parseExpression ( ) ;
288291 this . expectCharacter ( $RBRACKET ) ;
289292 result = new KeyedAccess ( result , key ) ;
290293
294+ } else if ( this . optionalCharacter ( $LPAREN ) ) {
295+ var args = this . parseCallArguments ( ) ;
296+ this . expectCharacter ( $RPAREN ) ;
297+ result = new FunctionCall ( result , this . closureMap , args ) ;
298+
291299 } else {
292300 return result ;
293301 }
@@ -316,7 +324,7 @@ class _ParseAST {
316324 return this . parseLiteralMap ( ) ;
317325
318326 } else if ( this . next . isIdentifier ( ) ) {
319- return this . parseFieldRead ( _implicitReceiver ) ;
327+ return this . parseAccessorOrMethodCall ( _implicitReceiver ) ;
320328
321329 } else if ( this . next . isNumber ( ) ) {
322330 var value = this . next . toNumber ( ) ;
@@ -362,9 +370,29 @@ class _ParseAST {
362370 return new LiteralMap ( keys , values ) ;
363371 }
364372
365- parseFieldRead ( receiver ) :AST {
373+ parseAccessorOrMethodCall ( receiver ) :AST {
366374 var id = this . expectIdentifierOrKeyword ( ) ;
367- return new FieldRead ( receiver , id , this . closureMap . getter ( id ) , this . closureMap . setter ( id ) ) ;
375+
376+ if ( this . optionalCharacter ( $LPAREN ) ) {
377+ var args = this . parseCallArguments ( ) ;
378+ this . expectCharacter ( $RPAREN ) ;
379+ var fn = this . closureMap . fn ( id ) ;
380+ return new MethodCall ( receiver , fn , args ) ;
381+
382+ } else {
383+ var getter = this . closureMap . getter ( id ) ;
384+ var setter = this . closureMap . setter ( id ) ;
385+ return new FieldRead ( receiver , id , getter , setter ) ;
386+ }
387+ }
388+
389+ parseCallArguments ( ) {
390+ if ( this . next . isCharacter ( $RPAREN ) ) return [ ] ;
391+ var positionals = [ ] ;
392+ do {
393+ ListWrapper . push ( positionals , this . parseExpression ( ) ) ;
394+ } while ( this . optionalCharacter ( $COMMA ) )
395+ return positionals ;
368396 }
369397
370398 error ( message :string , index :int = null ) {
0 commit comments