Skip to content

Commit f7f49e9

Browse files
author
Luma
committed
Support function default arguments.
Compile result is changed.
1 parent 1d130bc commit f7f49e9

File tree

6 files changed

+23
-5
lines changed

6 files changed

+23
-5
lines changed

autoload/vimlparser.vim

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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
49624969
function! 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)

test/test1.ok

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
; test1
2-
(function (s:foo a b . ...)
2+
(function (s:foo) (a b . ...)
3+
(return 0))
4+
(function (s:bar) (a b . ...) (1 2)
35
(return 0))
46
(if 1
57
(echo "if 1")

test/test1.vim

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
function s:foo(a, b, ...)
33
return 0
44
endfunction
5+
function s:bar(a = 1, b = 2, ...)
6+
return 0
7+
endfunction
58
if 1
69
echo "if 1"
710
elseif 2

test/test_err_funcarg_default.ok

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
vimlparser: E989: Non-default argument follows default argument: line 1 col 21

test/test_err_funcarg_default.vim

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
function Foo(abc=1, xyz)
2+
endfunction

test/test_xxx_funcarg_last_comma.ok

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
(function (F a))
2-
(function (G a))
1+
(function (F) (a))
2+
(function (G) (a))

0 commit comments

Comments
 (0)