File tree 3 files changed +28
-4
lines changed
3 files changed +28
-4
lines changed Original file line number Diff line number Diff line change @@ -65,6 +65,7 @@ type Function struct {
65
65
Body []Statement // function body
66
66
Name Expr // function name
67
67
Params []* Ident // parameters
68
+ DefaultArgs []Expr // default arguments
68
69
Attr FuncAttr // function attributes
69
70
EndFunction * EndFunction // :endfunction
70
71
}
Original file line number Diff line number Diff line change @@ -153,13 +153,22 @@ func (c *Compiler) compileFunction(node *ast.Function) {
153
153
if len (node .Params ) > 0 {
154
154
c .fprint (" " )
155
155
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 ) {
160
163
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 )])))
161
167
}
162
168
}
169
+ if remaining {
170
+ ps = append (ps , ". ..." )
171
+ }
163
172
c .fprint ("%s" , strings .Join (ps , " " ))
164
173
}
165
174
c .fprintln (")" )
Original file line number Diff line number Diff line change @@ -69,6 +69,7 @@ func newAstNode(n *VimNode, filename string) ast.Node {
69
69
Body : newBody (* n , filename ),
70
70
Name : newExprNode (n .left , filename ),
71
71
Params : newIdents (* n , filename ),
72
+ DefaultArgs : newExprs (n .default_args , filename ),
72
73
Attr : attr ,
73
74
EndFunction : newAstNode (n .endfunction , filename ).(* ast.EndFunction ),
74
75
}
@@ -605,6 +606,19 @@ func newList(n VimNode, filename string) []ast.Expr {
605
606
return list
606
607
}
607
608
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
+
608
622
func newValues (n VimNode , filename string ) []ast.Expr {
609
623
var values []ast.Expr
610
624
for _ , v := range n .value .([]interface {}) {
You can’t perform that action at this time.
0 commit comments