@@ -400,13 +400,14 @@ endfunction
400
400
" PLUS .left
401
401
" SUBSCRIPT .left .right
402
402
" SLICE .left .rlist
403
- " METHOD .left .right .lambda_rlist
403
+ " METHOD .left .right
404
404
" CALL .left .rlist
405
405
" DOT .left .right
406
406
" NUMBER .value
407
407
" STRING .value
408
408
" LIST .value
409
409
" DICT .value
410
+ " BLOB .value
410
411
" NESTING .left
411
412
" OPTION .value
412
413
" IDENTIFIER .value
@@ -4055,44 +4056,26 @@ function! s:ExprParser.parse_expr8() abort
4055
4056
endif
4056
4057
unlet node
4057
4058
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 ()
4058
4068
let node = s: Node (s: NODE_METHOD )
4059
4069
let node.pos = token.pos
4060
4070
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
4066
4072
let left = node
4067
4073
unlet node
4068
4074
elseif token.type == # s: TOKEN_POPEN
4069
4075
let node = s: Node (s: NODE_CALL )
4070
4076
let node.pos = token.pos
4071
4077
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 ()
4096
4079
let left = node
4097
4080
unlet node
4098
4081
elseif ! s: iswhite (c ) && token.type == # s: TOKEN_DOT " TODO check scriptversion?
@@ -4111,6 +4094,35 @@ function! s:ExprParser.parse_expr8() abort
4111
4094
return left
4112
4095
endfunction
4113
4096
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
+
4114
4126
" expr9: number
4115
4127
" "string"
4116
4128
" 'string'
0 commit comments