Skip to content

Commit 4727f81

Browse files
rhendricerikd
authored andcommitted
Add support for destructuring in var declarations
Covers var, let, and const.
1 parent 5582f95 commit 4727f81

File tree

4 files changed

+9
-4
lines changed

4 files changed

+9
-4
lines changed

src/Language/JavaScript/Parser/Grammar7.y

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -958,14 +958,14 @@ VariableDeclarationListNoIn : VariableDeclarationNoIn
958958
-- VariableDeclaration : See 12.2
959959
-- Identifier Initialiseropt
960960
VariableDeclaration :: { AST.JSExpression }
961-
VariableDeclaration : Identifier SimpleAssign AssignmentExpression { AST.JSVarInitExpression $1 (AST.JSVarInit $2 $3) {- 'JSVarInitExpression1' -} }
962-
| Identifier { AST.JSVarInitExpression $1 AST.JSVarInitNone {- 'JSVarInitExpression2' -} }
961+
VariableDeclaration : PrimaryExpression SimpleAssign AssignmentExpression { AST.JSVarInitExpression $1 (AST.JSVarInit $2 $3) {- 'JSVarInitExpression1' -} }
962+
| Identifier { AST.JSVarInitExpression $1 AST.JSVarInitNone {- 'JSVarInitExpression2' -} }
963963

964964
-- VariableDeclarationNoIn : See 12.2
965965
-- Identifier InitialiserNoInopt
966966
VariableDeclarationNoIn :: { AST.JSExpression }
967-
VariableDeclarationNoIn : Identifier SimpleAssign AssignmentExpression { AST.JSVarInitExpression $1 (AST.JSVarInit $2 $3) {- 'JSVarInitExpressionInit2' -} }
968-
| Identifier { AST.JSVarInitExpression $1 AST.JSVarInitNone {- 'JSVarInitExpression2' -} }
967+
VariableDeclarationNoIn : PrimaryExpression SimpleAssign AssignmentExpression { AST.JSVarInitExpression $1 (AST.JSVarInit $2 $3) {- 'JSVarInitExpressionInit2' -} }
968+
| Identifier { AST.JSVarInitExpression $1 AST.JSVarInitNone {- 'JSVarInitExpression2' -} }
969969

970970
-- EmptyStatement : See 12.3
971971
-- ;

test/Test/Language/Javascript/Minify.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ testMinifyStmt = describe "Minify statements:" $ do
225225
minifyStmt " var d = 1, x = 2 ; " `shouldBe` "var d=1,x=2"
226226
minifyStmt " let c = 1 ; " `shouldBe` "let c=1"
227227
minifyStmt " let d = 1, x = 2 ; " `shouldBe` "let d=1,x=2"
228+
minifyStmt " const { a : [ b , c ] } = d; " `shouldBe` "const{a:[b,c]}=d"
228229

229230
it "string concatenation" $
230231
minifyStmt " f (\"ab\"+\"cd\") " `shouldBe` "f('abcd')"

test/Test/Language/Javascript/RoundTrip.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ testRoundTrip = describe "Roundtrip:" $ do
105105
testRT "switch (x) {default:break;}"
106106
testRT "switch (x) {default:\ncase 1:break;}"
107107
testRT "var x=1;let y=2;"
108+
testRT "var [x, y]=z;"
109+
testRT "let {x: [y]}=z;"
108110

109111
it "module" $ do
110112
testRTModule "import def from 'mod'"

test/Test/Language/Javascript/StatementParser.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ testStatementParser = describe "Parse statements:" $ do
6161
testStmt "var x=1;" `shouldBe` "Right (JSAstStatement (JSVariable (JSVarInitExpression (JSIdentifier 'x') [JSDecimal '1'])))"
6262
testStmt "const x=1,y=2;" `shouldBe` "Right (JSAstStatement (JSConstant (JSVarInitExpression (JSIdentifier 'x') [JSDecimal '1'],JSVarInitExpression (JSIdentifier 'y') [JSDecimal '2'])))"
6363
testStmt "let x=1,y=2;" `shouldBe` "Right (JSAstStatement (JSLet (JSVarInitExpression (JSIdentifier 'x') [JSDecimal '1'],JSVarInitExpression (JSIdentifier 'y') [JSDecimal '2'])))"
64+
testStmt "var [a,b]=x" `shouldBe` "Right (JSAstStatement (JSVariable (JSVarInitExpression (JSArrayLiteral [JSIdentifier 'a',JSComma,JSIdentifier 'b']) [JSIdentifier 'x'])))"
65+
testStmt "const {a:b}=x" `shouldBe` "Right (JSAstStatement (JSConstant (JSVarInitExpression (JSObjectLiteral [JSPropertyNameandValue (JSIdentifier 'a') [JSIdentifier 'b']]) [JSIdentifier 'x'])))"
6466

6567
it "break" $ do
6668
testStmt "break;" `shouldBe` "Right (JSAstStatement (JSBreak,JSSemicolon))"

0 commit comments

Comments
 (0)