diff --git a/js/ast.go b/js/ast.go index 36053e7..31a58a3 100644 --- a/js/ast.go +++ b/js/ast.go @@ -1064,10 +1064,14 @@ func (n ImportMetaExpr) String() string { return "(import.meta)" } +type Arg struct { + Value IExpr + Rest bool +} + // Args is a list of arguments as used by new and call expressions. type Args struct { - List []IExpr - Rest IExpr // can be nil + List []Arg } func (n Args) String() string { @@ -1076,13 +1080,10 @@ func (n Args) String() string { if i != 0 { s += ", " } - s += item.String() - } - if n.Rest != nil { - if len(n.List) != 0 { - s += ", " + if item.Rest { + s += "..." } - s += "..." + n.Rest.String() + s += item.Value.String() } return s + ")" } diff --git a/js/parse.go b/js/parse.go index c8fcbd5..6015d63 100644 --- a/js/parse.go +++ b/js/parse.go @@ -1315,21 +1315,20 @@ func (p *Parser) parseTemplateLiteral(precLeft OpPrec) (template TemplateExpr) { func (p *Parser) parseArguments() (args Args) { // assume we're on ( p.next() - args.List = make([]IExpr, 0, 4) + args.List = make([]Arg, 0, 4) for { - if p.tt == EllipsisToken { + rest := p.tt == EllipsisToken + if rest { p.next() - args.Rest = p.parseExpression(OpAssign) - if p.tt == CommaToken { - p.next() - } - break } if p.tt == CloseParenToken || p.tt == ErrorToken { break } - args.List = append(args.List, p.parseExpression(OpAssign)) + args.List = append(args.List, Arg{ + Value: p.parseExpression(OpAssign), + Rest: rest, + }) if p.tt == CommaToken { p.next() } @@ -1572,7 +1571,7 @@ func (p *Parser) parseExpression(prec OpPrec) IExpr { newExpr := &NewExpr{p.parseExpression(OpNew), nil} if p.tt == OpenParenToken { args := p.parseArguments() - if len(args.List) != 0 || args.Rest != nil { + if len(args.List) != 0 { newExpr.Args = &args } precLeft = OpMember diff --git a/js/parse_test.go b/js/parse_test.go index 95a3feb..5259d84 100644 --- a/js/parse_test.go +++ b/js/parse_test.go @@ -250,6 +250,7 @@ func TestParse(t *testing.T) { {"x = a?.(b)", "Stmt(x=(a?.(b)))"}, {"x = super(a)", "Stmt(x=(super(a)))"}, {"x = a(a,b,...c,)", "Stmt(x=(a(a, b, ...c)))"}, + {"x = a(...a,...b)", "Stmt(x=(a(...a, ...b)))"}, {"x = new a", "Stmt(x=(new a))"}, {"x = new a()", "Stmt(x=(new a))"}, {"x = new a(b)", "Stmt(x=(new a(b)))"},