@@ -319,7 +319,7 @@ endfunction
319319" TOPLEVEL .body
320320" COMMENT .str
321321" EXCMD .ea .str
322- " FUNCTION .ea .body .left .rlist .attr .endfunction
322+ " FUNCTION .ea .body .left .rlist .default_args . attr .endfunction
323323" ENDFUNCTION .ea
324324" DELFUNCTION .ea .left
325325" RETURN .ea .left
@@ -1358,6 +1358,7 @@ function! s:VimLParser.parse_cmd_function() abort
13581358 let node.ea = self .ea
13591359 let node.left = left
13601360 let node.rlist = []
1361+ let node.default_args = []
13611362 let node.attr = {' range' : 0 , ' abort' : 0 , ' dict' : 0 , ' closure' : 0 }
13621363 let node.endfunction = s: NIL
13631364 call self .reader.getn (1 )
@@ -1379,6 +1380,12 @@ function! s:VimLParser.parse_cmd_function() abort
13791380 let varnode.pos = token.pos
13801381 let varnode.value = token.value
13811382 call add (node.rlist, varnode)
1383+ if tokenizer.peek ().type == # s: TOKEN_EQ
1384+ call tokenizer.get ()
1385+ call add (node.default_args, self .parse_expr ())
1386+ elseif len (node.default_args) > 0
1387+ throw s: Err (' E989: Non-default argument follows default argument' , varnode.pos)
1388+ endif
13821389 " XXX: Vim doesn't skip white space before comma. F(a ,b) => E475
13831390 if s: iswhite (self .reader.p (0 )) && tokenizer.peek ().type == # s: TOKEN_COMMA
13841391 throw s: Err (' E475: Invalid argument: White space is not allowed before comma' , self .reader.getpos ())
@@ -4962,13 +4969,16 @@ endfunction
49624969function ! s: Compiler .compile_function (node) abort
49634970 let left = self .compile (a: node .left )
49644971 let rlist = map (a: node .rlist, ' self.compile(v:val)' )
4972+ let default_args = map (a: node .default_args, ' self.compile(v:val)' )
49654973 if ! empty (rlist) && rlist[-1 ] == # ' ...'
49664974 let rlist[-1 ] = ' . ...'
49674975 endif
49684976 if empty (rlist)
49694977 call self .out (' (function (%s)' , left )
4978+ elseif empty (default_args)
4979+ call self .out (' (function (%s) (%s)' , left , join (rlist, ' ' ))
49704980 else
4971- call self .out (' (function (%s %s)' , left , join (rlist, ' ' ))
4981+ call self .out (' (function (%s) ( %s) (%s) ' , left , join (rlist, ' ' ), join (default_args , ' ' ))
49724982 endif
49734983 call self .incindent (' ' )
49744984 call self .compile_body (a: node .body)
0 commit comments