@@ -400,13 +400,14 @@ endfunction
400400" PLUS .left
401401" SUBSCRIPT .left .right
402402" SLICE .left .rlist
403- " METHOD .left .right .lambda_rlist
403+ " METHOD .left .right
404404" CALL .left .rlist
405405" DOT .left .right
406406" NUMBER .value
407407" STRING .value
408408" LIST .value
409409" DICT .value
410+ " BLOB .value
410411" NESTING .left
411412" OPTION .value
412413" IDENTIFIER .value
@@ -4055,44 +4056,26 @@ function! s:ExprParser.parse_expr8() abort
40554056 endif
40564057 unlet node
40574058 elseif token.type == # s: TOKEN_ARROW
4059+ let funcname_or_lambda = self .parse_expr9 ()
4060+ let token = self .tokenizer.get ()
4061+ if token.type !=# s: TOKEN_POPEN
4062+ throw s: Err (' E107: Missing parentheses: lambda' , token.pos)
4063+ endif
4064+ let right = s: Node (s: NODE_CALL )
4065+ let right .pos = token.pos
4066+ let right .left = funcname_or_lambda
4067+ let right .rlist = self .parse_rlist ()
40584068 let node = s: Node (s: NODE_METHOD )
40594069 let node.pos = token.pos
40604070 let node.left = left
4061- let node.right = self .parse_expr8 ()
4062- let node.lambda_rlist = s: NIL
4063- if node.right .type !=# s: NODE_CALL
4064- throw s: Err (' Rhs of method operator must be an function call' , node.right .pos)
4065- endif
4071+ let node.right = right
40664072 let left = node
40674073 unlet node
40684074 elseif token.type == # s: TOKEN_POPEN
40694075 let node = s: Node (s: NODE_CALL )
40704076 let node.pos = token.pos
40714077 let node.left = left
4072- let node.rlist = []
4073- if self .tokenizer.peek ().type == # s: TOKEN_PCLOSE
4074- call self .tokenizer.get ()
4075- else
4076- while s: TRUE
4077- call add (node.rlist, self .parse_expr1 ())
4078- let token = self .tokenizer.get ()
4079- if token.type == # s: TOKEN_COMMA
4080- " XXX: Vim allows foo(a, b, ). Lint should warn it.
4081- if self .tokenizer.peek ().type == # s: TOKEN_PCLOSE
4082- call self .tokenizer.get ()
4083- break
4084- endif
4085- elseif token.type == # s: TOKEN_PCLOSE
4086- break
4087- else
4088- throw s: Err (printf (' unexpected token: %s' , token.value), token.pos)
4089- endif
4090- endwhile
4091- endif
4092- if len (node.rlist) > s: MAX_FUNC_ARGS
4093- " TODO: funcname E740: Too many arguments for function: %s
4094- throw s: Err (' E740: Too many arguments for function' , node.pos)
4095- endif
4078+ let node.rlist = self .parse_rlist ()
40964079 let left = node
40974080 unlet node
40984081 elseif ! s: iswhite (c ) && token.type == # s: TOKEN_DOT " TODO check scriptversion?
@@ -4111,6 +4094,35 @@ function! s:ExprParser.parse_expr8() abort
41114094 return left
41124095endfunction
41134096
4097+ function ! s: ExprParser .parse_rlist () abort
4098+ let rlist = []
4099+ let token = self .tokenizer.peek ()
4100+ if self .tokenizer.peek ().type == # s: TOKEN_PCLOSE
4101+ call self .tokenizer.get ()
4102+ else
4103+ while s: TRUE
4104+ call add (rlist, self .parse_expr1 ())
4105+ let token = self .tokenizer.get ()
4106+ if token.type == # s: TOKEN_COMMA
4107+ " XXX: Vim allows foo(a, b, ). Lint should warn it.
4108+ if self .tokenizer.peek ().type == # s: TOKEN_PCLOSE
4109+ call self .tokenizer.get ()
4110+ break
4111+ endif
4112+ elseif token.type == # s: TOKEN_PCLOSE
4113+ break
4114+ else
4115+ throw s: Err (printf (' unexpected token: %s' , token.value), token.pos)
4116+ endif
4117+ endwhile
4118+ endif
4119+ if len (rlist) > s: MAX_FUNC_ARGS
4120+ " TODO: funcname E740: Too many arguments for function: %s
4121+ throw s: Err (' E740: Too many arguments for function' , token.pos)
4122+ endif
4123+ return rlist
4124+ endfunction
4125+
41144126" expr9: number
41154127" "string"
41164128" 'string'
0 commit comments