diff --git a/js/parse.go b/js/parse.go index 657c7f6..9c67988 100644 --- a/js/parse.go +++ b/js/parse.go @@ -1444,21 +1444,22 @@ func (p *Parser) parseArguments() (args Args) { // assume we're on ( p.next() args.List = make([]Arg, 0, 4) - for { + for p.tt != CloseParenToken && p.tt != ErrorToken { rest := p.tt == EllipsisToken if rest { p.next() } - - if p.tt == CloseParenToken || p.tt == ErrorToken { - break - } args.List = append(args.List, Arg{ Value: p.parseExpression(OpAssign), Rest: rest, }) - if p.tt == CommaToken { - p.next() + if p.tt != CloseParenToken { + if p.tt != CommaToken { + p.fail("arguments", CommaToken, CloseParenToken) + return + } else { + p.next() // CommaToken + } } } p.consume("arguments", CloseParenToken) diff --git a/js/parse_test.go b/js/parse_test.go index 0d91637..76f4d56 100644 --- a/js/parse_test.go +++ b/js/parse_test.go @@ -535,12 +535,12 @@ func TestParseError(t *testing.T) { {"x=new.bad", "expected target instead of bad in new.target expression"}, {"x=import.bad", "expected meta instead of bad in import.meta expression"}, {"x=super", "expected [, (, or . instead of EOF in super expression"}, - {"x=super(a", "expected ) instead of EOF in arguments"}, + {"x=super(a", "expected , or ) instead of EOF in arguments"}, {"x=super[a", "expected ] instead of EOF in index expression"}, {"x=super.", "expected Identifier instead of EOF in dot expression"}, {"x=new super(b)", "expected [ or . instead of ( in super expression"}, {"x=import", "expected ( instead of EOF in import expression"}, - {"x=import(5", "expected ) instead of EOF in arguments"}, + {"x=import(5", "expected , or ) instead of EOF in arguments"}, {"x=new import(b)", "unexpected ( in expression"}, {"import", "expected String, Identifier, *, or { instead of EOF in import statement"}, {"import *", "expected as instead of EOF in import statement"},