Skip to content

Commit 7d228ec

Browse files
committed
implement compiling default arguments
1 parent 32c42a9 commit 7d228ec

File tree

3 files changed

+28
-4
lines changed

3 files changed

+28
-4
lines changed

ast/node.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff 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
}

compiler/compiler.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff 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(")")

go/export.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff 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+
608622
func newValues(n VimNode, filename string) []ast.Expr {
609623
var values []ast.Expr
610624
for _, v := range n.value.([]interface{}) {

0 commit comments

Comments
 (0)