File tree Expand file tree Collapse file tree 3 files changed +28
-4
lines changed Expand file tree Collapse file tree 3 files changed +28
-4
lines changed Original file line number Diff line number Diff line change @@ -65,6 +65,7 @@ type Function struct {
6565 Body []Statement // function body
6666 Name Expr // function name
6767 Params []* Ident // parameters
68+ DefaultArgs []Expr // default arguments
6869 Attr FuncAttr // function attributes
6970 EndFunction * EndFunction // :endfunction
7071}
Original file line number Diff line number Diff line change @@ -153,13 +153,22 @@ func (c *Compiler) compileFunction(node *ast.Function) {
153153 if len (node .Params ) > 0 {
154154 c .fprint (" " )
155155 ps := make ([]string , 0 , len (node .Params ))
156- for _ , p := range node .Params {
157- if p .Name == token .DOTDOTDOT .String () {
158- ps = append (ps , ". ..." )
159- } else {
156+ var remaining bool
157+ if node .Params [len (node .Params )- 1 ].Name == token .DOTDOTDOT .String () {
158+ node .Params = node .Params [:len (node .Params )- 1 ]
159+ remaining = true
160+ }
161+ for i , p := range node .Params {
162+ if i < len (node .Params )- len (node .DefaultArgs ) {
160163 ps = append (ps , p .Name )
164+ } else {
165+ ps = append (ps , fmt .Sprintf ("(%s %s)" , p .Name ,
166+ c .compileExpr (node .DefaultArgs [i + len (node .DefaultArgs )- len (node .Params )])))
161167 }
162168 }
169+ if remaining {
170+ ps = append (ps , ". ..." )
171+ }
163172 c .fprint ("%s" , strings .Join (ps , " " ))
164173 }
165174 c .fprintln (")" )
Original file line number Diff line number Diff line change @@ -69,6 +69,7 @@ func newAstNode(n *VimNode, filename string) ast.Node {
6969 Body : newBody (* n , filename ),
7070 Name : newExprNode (n .left , filename ),
7171 Params : newIdents (* n , filename ),
72+ DefaultArgs : newExprs (n .default_args , filename ),
7273 Attr : attr ,
7374 EndFunction : newAstNode (n .endfunction , filename ).(* ast.EndFunction ),
7475 }
@@ -605,6 +606,19 @@ func newList(n VimNode, filename string) []ast.Expr {
605606 return list
606607}
607608
609+ func newExprs (xs []* VimNode , filename string ) []ast.Expr {
610+ var list []ast.Expr
611+ if xs != nil {
612+ list = make ([]ast.Expr , 0 , len (xs ))
613+ }
614+ for _ , node := range xs {
615+ if node != nil { // conservative
616+ list = append (list , newExprNode (node , filename ))
617+ }
618+ }
619+ return list
620+ }
621+
608622func newValues (n VimNode , filename string ) []ast.Expr {
609623 var values []ast.Expr
610624 for _ , v := range n .value .([]interface {}) {
You can’t perform that action at this time.
0 commit comments