Codebase list golang-github-tdewolff-parse / e61ad7a
JS: fix when parenthesized expr has assignments for the same variable which only when interpreted as arguments for an arrow func should error Taco de Wolff 1 year, 8 months ago
2 changed file(s) with 18 addition(s) and 8 deletion(s). Raw diff Collapse all Expand all
14461446 p.await, p.yield = true, false
14471447
14481448 if IsIdentifier(p.tt) || !p.yield && p.tt == YieldToken {
1449 ref, _ := p.scope.Declare(ArgumentDecl, p.data)
1449 ref, _ := p.scope.Declare(ArgumentDecl, p.data) // cannot fail
14501450 p.next()
14511451 arrowFunc.Params.List = []BindingElement{{Binding: ref}}
14521452 } else {
21032103 data := p.data
21042104 p.next()
21052105 if p.tt == EqToken || p.tt == CommaToken || p.tt == CloseParenToken || p.tt == CloseBraceToken || p.tt == CloseBracketToken {
2106 var ok bool
21062107 var left IExpr
2107 left, _ = p.scope.Declare(ArgumentDecl, data) // cannot fail
2108 p.assumeArrowFunc = false
2109 left = p.parseExpressionSuffix(left, OpAssign, OpPrimary)
2110 p.assumeArrowFunc = true
2111 return left
2108 left, ok = p.scope.Declare(ArgumentDecl, data)
2109 if ok {
2110 p.assumeArrowFunc = false
2111 left = p.parseExpressionSuffix(left, OpAssign, OpPrimary)
2112 p.assumeArrowFunc = true
2113 return left
2114 }
21122115 }
21132116 p.assumeArrowFunc = false
21142117 if tt == AsyncToken {
21472150 p.next()
21482151 }
21492152 } else if p.isIdentifierReference(p.tt) {
2150 rest, _ = p.scope.Declare(ArgumentDecl, p.data) // cannot fail
2153 var ok bool
2154 rest, ok = p.scope.Declare(ArgumentDecl, p.data)
2155 if !ok {
2156 p.failMessage("identifier %s has already been declared", string(p.data))
2157 return nil
2158 }
21512159 p.next()
21522160 } else if p.tt == OpenBracketToken {
21532161 array := p.parseArrayLiteral()
623623 {"x = ({...5}) =>", "unexpected => in expression"},
624624 {"x = ({5: 5}) =>", "unexpected => in expression"},
625625 {"x = ({[4+5]: 5}) =>", "unexpected => in expression"},
626 {"x = (a, a) =>", "unexpected => in expression"},
627 {"x = (a, a, ...a) =>", "unexpected ... in expression"},
628 {"x = (a, ...a) =>", "identifier a has already been declared"},
626629
627630 // expression precedence
628631 {"x = a + yield b", "unexpected b in expression"},
951954 {"(a,b=a) => {}", "/a=1,b=2", "/"},
952955 {"(a=b,b)=>{}", "/a=2,b=3", "b=1/b=1"},
953956 {"a=>{var a}", "/a=1", "/"},
954 {"(a,a)=>{}", "/a=1", "/"},
955957 {"(a=b) => {var b}", "/a=2,b=3", "b=1/b=1"},
956958 {"({[a+b]:c}) => {}", "/c=3", "a=1,b=2/a=1,b=2"},
957959 {"({a:b, c=d, ...e}=f) => 5", "/b=3,c=4,e=5", "d=1,f=2/d=1,f=2"},