@@ -4028,44 +4028,26 @@ function! s:ExprParser.parse_expr8() abort
4028
4028
endif
4029
4029
unlet node
4030
4030
elseif token.type == # s: TOKEN_ARROW
4031
+ let funcname_or_lambda = self .parse_expr9 ()
4032
+ let token = self .tokenizer.get ()
4033
+ if token.type !=# s: TOKEN_POPEN
4034
+ throw s: Err (' E107: Missing parentheses: lambda' , token.pos)
4035
+ endif
4036
+ let right = s: Node (s: NODE_CALL )
4037
+ let right .pos = token.pos
4038
+ let right .left = funcname_or_lambda
4039
+ let right .rlist = self .parse_rlist ()
4031
4040
let node = s: Node (s: NODE_METHOD )
4032
4041
let node.pos = token.pos
4033
4042
let node.left = left
4034
- let node.right = self .parse_expr8 ()
4035
- let node.lambda_rlist = s: NIL
4036
- if node.right .type !=# s: NODE_CALL
4037
- throw s: Err (' Rhs of method operator must be an function call' , node.right .pos)
4038
- endif
4043
+ let node.right = right
4039
4044
let left = node
4040
4045
unlet node
4041
4046
elseif token.type == # s: TOKEN_POPEN
4042
4047
let node = s: Node (s: NODE_CALL )
4043
4048
let node.pos = token.pos
4044
4049
let node.left = left
4045
- let node.rlist = []
4046
- if self .tokenizer.peek ().type == # s: TOKEN_PCLOSE
4047
- call self .tokenizer.get ()
4048
- else
4049
- while s: TRUE
4050
- call add (node.rlist, self .parse_expr1 ())
4051
- let token = self .tokenizer.get ()
4052
- if token.type == # s: TOKEN_COMMA
4053
- " XXX: Vim allows foo(a, b, ). Lint should warn it.
4054
- if self .tokenizer.peek ().type == # s: TOKEN_PCLOSE
4055
- call self .tokenizer.get ()
4056
- break
4057
- endif
4058
- elseif token.type == # s: TOKEN_PCLOSE
4059
- break
4060
- else
4061
- throw s: Err (printf (' unexpected token: %s' , token.value), token.pos)
4062
- endif
4063
- endwhile
4064
- endif
4065
- if len (node.rlist) > s: MAX_FUNC_ARGS
4066
- " TODO: funcname E740: Too many arguments for function: %s
4067
- throw s: Err (' E740: Too many arguments for function' , node.pos)
4068
- endif
4050
+ let node.rlist = self .parse_rlist ()
4069
4051
let left = node
4070
4052
unlet node
4071
4053
elseif ! s: iswhite (c ) && token.type == # s: TOKEN_DOT " TODO check scriptversion?
@@ -4084,6 +4066,35 @@ function! s:ExprParser.parse_expr8() abort
4084
4066
return left
4085
4067
endfunction
4086
4068
4069
+ function ! s: ExprParser .parse_rlist () abort
4070
+ let rlist = []
4071
+ let token = self .tokenizer.peek ()
4072
+ if self .tokenizer.peek ().type == # s: TOKEN_PCLOSE
4073
+ call self .tokenizer.get ()
4074
+ else
4075
+ while s: TRUE
4076
+ call add (rlist, self .parse_expr1 ())
4077
+ let token = self .tokenizer.get ()
4078
+ if token.type == # s: TOKEN_COMMA
4079
+ " XXX: Vim allows foo(a, b, ). Lint should warn it.
4080
+ if self .tokenizer.peek ().type == # s: TOKEN_PCLOSE
4081
+ call self .tokenizer.get ()
4082
+ break
4083
+ endif
4084
+ elseif token.type == # s: TOKEN_PCLOSE
4085
+ break
4086
+ else
4087
+ throw s: Err (printf (' unexpected token: %s' , token.value), token.pos)
4088
+ endif
4089
+ endwhile
4090
+ endif
4091
+ if len (rlist) > s: MAX_FUNC_ARGS
4092
+ " TODO: funcname E740: Too many arguments for function: %s
4093
+ throw s: Err (' E740: Too many arguments for function' , token.pos)
4094
+ endif
4095
+ return rlist
4096
+ endfunction
4097
+
4087
4098
" expr9: number
4088
4099
" "string"
4089
4100
" 'string'
0 commit comments