@@ -131,6 +131,10 @@ import qualified Language.JavaScript.Parser.AST as AST
131
131
' octal' { OctalToken {} }
132
132
' string' { StringToken {} }
133
133
' regex' { RegExToken {} }
134
+ ' tmplnosub' { NoSubstitutionTemplateToken {} }
135
+ ' tmplhead' { TemplateHeadToken {} }
136
+ ' tmplmiddle' { TemplateMiddleToken {} }
137
+ ' tmpltail' { TemplateTailToken {} }
134
138
135
139
' future' { FutureToken {} }
136
140
@@ -433,6 +437,7 @@ PrimaryExpression : 'this' { AST.JSLiteral (mkJSAnnot $1) "thi
433
437
| ArrayLiteral { $1 {- ' PrimaryExpression3' -} }
434
438
| ObjectLiteral { $1 {- ' PrimaryExpression4' -} }
435
439
| SpreadExpression { $1 {- ' PrimaryExpression5' -} }
440
+ | TemplateLiteral { mkJSTemplateLiteral Nothing $1 {- ' PrimaryExpression6' -} }
436
441
| LParen Expression RParen { AST.JSExpressionParen $1 $2 $3 }
437
442
438
443
-- Identifier :: See 7.6
@@ -494,6 +499,14 @@ IdentifierName : Identifier {$1}
494
499
SpreadExpression :: { AST.JSExpression }
495
500
SpreadExpression : Spread Expression { AST.JSSpreadExpression $1 $2 {- ' SpreadExpression' -} }
496
501
502
+ TemplateLiteral :: { JSUntaggedTemplate }
503
+ TemplateLiteral : ' tmplnosub' { JSUntaggedTemplate (mkJSAnnot $1 ) (tokenLiteral $1 ) [] }
504
+ | ' tmplhead' TemplateParts { JSUntaggedTemplate (mkJSAnnot $1 ) (tokenLiteral $1 ) $2 }
505
+
506
+ TemplateParts :: { [AST.JSTemplatePart] }
507
+ TemplateParts : Expression ' tmplmiddle' TemplateParts { AST.JSTemplatePart $1 (mkJSAnnot $2 ) (tokenLiteral $2 ) : $3 }
508
+ | Expression ' tmpltail' { AST.JSTemplatePart $1 (mkJSAnnot $2 ) (tokenLiteral $2 ) : [] }
509
+
497
510
-- ArrayLiteral : See 11.1.4
498
511
-- [ Elisionopt ]
499
512
-- [ ElementList ]
@@ -580,6 +593,7 @@ MemberExpression : PrimaryExpression { $1 {- 'MemberExpression1' -} }
580
593
| FunctionExpression { $1 {- ' MemberExpression2' -} }
581
594
| MemberExpression LSquare Expression RSquare { AST.JSMemberSquare $1 $2 $3 $4 {- ' MemberExpression3' -} }
582
595
| MemberExpression Dot IdentifierName { AST.JSMemberDot $1 $2 $3 {- ' MemberExpression4' -} }
596
+ | MemberExpression TemplateLiteral { mkJSTemplateLiteral (Just $1 ) $2 }
583
597
| New MemberExpression Arguments { mkJSMemberNew $1 $2 $3 {- ' MemberExpression5' -} }
584
598
585
599
-- NewExpression : See 11.2
@@ -603,6 +617,8 @@ CallExpression : MemberExpression Arguments
603
617
{ AST.JSCallExpressionSquare $1 $2 $3 $4 {- ' CallExpression3' -} }
604
618
| CallExpression Dot IdentifierName
605
619
{ AST.JSCallExpressionDot $1 $2 $3 {- ' CallExpression4' -} }
620
+ | CallExpression TemplateLiteral
621
+ { mkJSTemplateLiteral (Just $1 ) $2 {- ' CallExpression5' -} }
606
622
607
623
-- Arguments : See 11.2
608
624
-- ()
@@ -1332,7 +1348,7 @@ StatementMain : StatementNoEmpty Eof { AST.JSAstStatement $1 $2 {- 'Statement
1332
1348
1333
1349
-- Need this type while build the AST, but is not actually part of the AST.
1334
1350
data JSArguments = JSArguments AST.JSAnnot (AST.JSCommaList AST.JSExpression) AST.JSAnnot -- ^lb, args, rb
1335
-
1351
+ data JSUntaggedTemplate = JSUntaggedTemplate !AST.JSAnnot !String ![AST.JSTemplatePart] -- lquot, head, parts
1336
1352
1337
1353
blockToStatement :: AST.JSBlock -> AST.JSSemi -> AST.JSStatement
1338
1354
blockToStatement (AST.JSBlock a b c) s = AST.JSStatementBlock a b c s
@@ -1359,6 +1375,9 @@ parseError = alexError . show
1359
1375
mkJSAnnot :: Token -> AST.JSAnnot
1360
1376
mkJSAnnot a = AST.JSAnnot (tokenSpan a) (tokenComment a)
1361
1377
1378
+ mkJSTemplateLiteral :: Maybe AST.JSExpression -> JSUntaggedTemplate -> AST.JSExpression
1379
+ mkJSTemplateLiteral tag (JSUntaggedTemplate a h ps) = AST.JSTemplateLiteral tag a h ps
1380
+
1362
1381
-- ---------------------------------------------------------------------
1363
1382
-- | mkUnary : The parser detects '+' and '-' as the binary version of these
1364
1383
-- operator. This function converts from the binary version to the unary
0 commit comments