@@ -89,6 +89,7 @@ import qualified Language.JavaScript.Parser.AST as AST
89
89
' break' { BreakToken {} }
90
90
' case' { CaseToken {} }
91
91
' catch' { CatchToken {} }
92
+ ' class' { ClassToken {} }
92
93
' const' { ConstToken {} }
93
94
' continue' { ContinueToken {} }
94
95
' debugger' { DebuggerToken {} }
@@ -98,6 +99,7 @@ import qualified Language.JavaScript.Parser.AST as AST
98
99
' else' { ElseToken {} }
99
100
' enum' { EnumToken {} }
100
101
' export' { ExportToken {} }
102
+ ' extends' { ExtendsToken {} }
101
103
' false' { FalseToken {} }
102
104
' finally' { FinallyToken {} }
103
105
' for' { ForToken {} }
@@ -114,6 +116,7 @@ import qualified Language.JavaScript.Parser.AST as AST
114
116
' of' { OfToken {} }
115
117
' return' { ReturnToken {} }
116
118
' set' { SetToken {} }
119
+ ' static' { StaticToken {} }
117
120
' switch' { SwitchToken {} }
118
121
' this' { ThisToken {} }
119
122
' throw' { ThrowToken {} }
@@ -330,6 +333,7 @@ IdentifierName : Identifier {$1}
330
333
| ' break' { AST.JSIdentifier (mkJSAnnot $1 ) " break" }
331
334
| ' case' { AST.JSIdentifier (mkJSAnnot $1 ) " case" }
332
335
| ' catch' { AST.JSIdentifier (mkJSAnnot $1 ) " catch" }
336
+ | ' class' { AST.JSIdentifier (mkJSAnnot $1 ) " class" }
333
337
| ' const' { AST.JSIdentifier (mkJSAnnot $1 ) " const" }
334
338
| ' continue' { AST.JSIdentifier (mkJSAnnot $1 ) " continue" }
335
339
| ' debugger' { AST.JSIdentifier (mkJSAnnot $1 ) " debugger" }
@@ -339,6 +343,7 @@ IdentifierName : Identifier {$1}
339
343
| ' else' { AST.JSIdentifier (mkJSAnnot $1 ) " else" }
340
344
| ' enum' { AST.JSIdentifier (mkJSAnnot $1 ) " enum" }
341
345
| ' export' { AST.JSIdentifier (mkJSAnnot $1 ) " export" }
346
+ | ' extends' { AST.JSIdentifier (mkJSAnnot $1 ) " extends" }
342
347
| ' false' { AST.JSIdentifier (mkJSAnnot $1 ) " false" }
343
348
| ' finally' { AST.JSIdentifier (mkJSAnnot $1 ) " finally" }
344
349
| ' for' { AST.JSIdentifier (mkJSAnnot $1 ) " for" }
@@ -351,6 +356,7 @@ IdentifierName : Identifier {$1}
351
356
| ' null' { AST.JSIdentifier (mkJSAnnot $1 ) " null" }
352
357
| ' of' { AST.JSIdentifier (mkJSAnnot $1 ) " of" }
353
358
| ' return' { AST.JSIdentifier (mkJSAnnot $1 ) " return" }
359
+ | ' static' { AST.JSIdentifier (mkJSAnnot $1 ) " static" }
354
360
| ' switch' { AST.JSIdentifier (mkJSAnnot $1 ) " switch" }
355
361
| ' this' { AST.JSIdentifier (mkJSAnnot $1 ) " this" }
356
362
| ' throw' { AST.JSIdentifier (mkJSAnnot $1 ) " throw" }
@@ -435,6 +441,15 @@ Function : 'function' { mkJSAnnot $1 {- 'Function' -} }
435
441
New :: { AST.JSAnnot }
436
442
New : ' new' { mkJSAnnot $1 }
437
443
444
+ Class :: { AST.JSAnnot }
445
+ Class : ' class' { mkJSAnnot $1 }
446
+
447
+ Extends :: { AST.JSAnnot }
448
+ Extends : ' extends' { mkJSAnnot $1 }
449
+
450
+ Static :: { AST.JSAnnot }
451
+ Static : ' static' { mkJSAnnot $1 }
452
+
438
453
439
454
Eof :: { AST.JSAnnot }
440
455
Eof : ' tail' { mkJSAnnot $1 {- ' Eof' -} }
@@ -486,6 +501,7 @@ PrimaryExpression : 'this' { AST.JSLiteral (mkJSAnnot $1) "thi
486
501
| Literal { $1 {- ' PrimaryExpression2' -} }
487
502
| ArrayLiteral { $1 {- ' PrimaryExpression3' -} }
488
503
| ObjectLiteral { $1 {- ' PrimaryExpression4' -} }
504
+ | ClassExpression { $1 }
489
505
| GeneratorExpression { $1 }
490
506
| TemplateLiteral { mkJSTemplateLiteral Nothing $1 {- ' PrimaryExpression6' -} }
491
507
| LParen Expression RParen { AST.JSExpressionParen $1 $2 $3 }
@@ -1272,6 +1288,44 @@ FormalParameterList : AssignmentExpression { AST.JSLOn
1272
1288
FunctionBody :: { AST.JSBlock }
1273
1289
FunctionBody : Block { $1 {- ' FunctionBody1' -} }
1274
1290
1291
+ -- ClassDeclaration :
1292
+ -- class BindingIdentifier ClassTail
1293
+ -- class ClassTail
1294
+ -- ClassExpression :
1295
+ -- class BindingIdentifieropt ClassTail
1296
+ -- ClassTail :
1297
+ -- ClassHeritageopt { ClassBodyopt }
1298
+ ClassDeclaration :: { AST.JSStatement }
1299
+ ClassDeclaration : Class Identifier ClassHeritage LBrace ClassBody RBrace { AST.JSClass $1 (identName $2 ) $3 $4 $5 $6 AST.JSSemiAuto }
1300
+
1301
+ ClassExpression :: { AST.JSExpression }
1302
+ ClassExpression : Class Identifier ClassHeritage LBrace ClassBody RBrace { AST.JSClassExpression $1 (identName $2 ) $3 $4 $5 $6 }
1303
+ | Class ClassHeritage LBrace ClassBody RBrace { AST.JSClassExpression $1 AST.JSIdentNone $2 $3 $4 $5 }
1304
+
1305
+ -- ClassHeritage :
1306
+ -- extends LeftHandSideExpression
1307
+ ClassHeritage :: { AST.JSClassHeritage }
1308
+ ClassHeritage : Extends LeftHandSideExpression { AST.JSExtends $1 $2 }
1309
+ | { AST.JSExtendsNone }
1310
+
1311
+ -- ClassBody :
1312
+ -- ClassElementList
1313
+ -- ClassElementList :
1314
+ -- ClassElement
1315
+ -- ClassElementList ClassElement
1316
+ ClassBody :: { [AST.JSClassElement] }
1317
+ ClassBody : { [] }
1318
+ | ClassBody ClassElement { $1 ++ [$2 ] }
1319
+
1320
+ -- ClassElement :
1321
+ -- MethodDefinition
1322
+ -- static MethodDefinition
1323
+ -- ;
1324
+ ClassElement :: { AST.JSClassElement }
1325
+ ClassElement : MethodDefinition { AST.JSClassInstanceMethod $1 }
1326
+ | Static MethodDefinition { AST.JSClassStaticMethod $1 $2 }
1327
+ | Semi { AST.JSClassSemi $1 }
1328
+
1275
1329
-- Program : See clause 14
1276
1330
-- SourceElementsopt
1277
1331
@@ -1357,7 +1411,7 @@ ImportSpecifier : IdentifierName
1357
1411
-- [ ] export Declaration
1358
1412
-- [ ] Declaration :
1359
1413
-- [ ] HoistableDeclaration
1360
- -- [ ] ClassDeclaration
1414
+ -- [x ] ClassDeclaration
1361
1415
-- [x] LexicalDeclaration
1362
1416
-- [ ] HoistableDeclaration :
1363
1417
-- [x] FunctionDeclaration
@@ -1378,6 +1432,8 @@ ExportDeclaration : ExportClause FromClause AutoSemi
1378
1432
{ AST.JSExport $1 $2 {- ' ExportDeclaration4' -} }
1379
1433
| GeneratorDeclaration AutoSemi
1380
1434
{ AST.JSExport $1 $2 {- ' ExportDeclaration5' -} }
1435
+ | ClassDeclaration AutoSemi
1436
+ { AST.JSExport $1 $2 {- ' ExportDeclaration6' -} }
1381
1437
1382
1438
-- ExportClause :
1383
1439
-- { }
@@ -1431,6 +1487,7 @@ expressionToStatement (AST.JSFunctionExpression a b@(AST.JSIdentName{}) c d e f)
1431
1487
expressionToStatement (AST.JSGeneratorExpression a b c@(AST.JSIdentName{}) d e f g) s = AST.JSGenerator a b c d e f g s
1432
1488
expressionToStatement (AST.JSAssignExpression lhs op rhs) s = AST.JSAssignStatement lhs op rhs s
1433
1489
expressionToStatement (AST.JSMemberExpression e l a r) s = AST.JSMethodCall e l a r s
1490
+ expressionToStatement (AST.JSClassExpression a b@(AST.JSIdentName{}) c d e f) s = AST.JSClass a b c d e f s
1434
1491
expressionToStatement exp s = AST.JSExpressionStatement exp s
1435
1492
1436
1493
0 commit comments