Skip to content

Commit

Permalink
fix #372: precedence of tagged templates
Browse files Browse the repository at this point in the history
  • Loading branch information
evanw committed Sep 8, 2020
1 parent 4fae626 commit 1be8af4
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 6 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Changelog

## Unreleased

* Fix precedence of tagged template expressions ([#372](https://github.com/evanw/esbuild/issues/372))

Previously `` await tag`text` `` and `` new tag`text` `` were incorrectly parsed as `` (await tag)`text` `` and `` (new tag)`text` ``. They are now correctly parsed as `` await (tag`text`) `` and `` new (tag`text`) `` instead.

## 0.6.32

* Allow `--format` when bundling is disabled ([#109](https://github.com/evanw/esbuild/issues/109))
Expand Down
6 changes: 0 additions & 6 deletions internal/parser/parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -2850,9 +2850,6 @@ func (p *parser) parseSuffix(left ast.Expr, level ast.L, errors *deferredErrors,
optionalChain = ast.OptionalChainContinue

case lexer.TNoSubstitutionTemplateLiteral:
if level >= ast.LPrefix {
return left
}
p.markSyntaxFeature(compat.TemplateLiteral, p.lexer.Range())
head := p.lexer.StringLiteral
headRaw := p.lexer.RawTemplateContents()
Expand All @@ -2861,9 +2858,6 @@ func (p *parser) parseSuffix(left ast.Expr, level ast.L, errors *deferredErrors,
left = ast.Expr{Loc: left.Loc, Data: &ast.ETemplate{Tag: &tag, Head: head, HeadRaw: headRaw}}

case lexer.TTemplateHead:
if level >= ast.LPrefix {
return left
}
p.markSyntaxFeature(compat.TemplateLiteral, p.lexer.Range())
head := p.lexer.StringLiteral
headRaw := p.lexer.RawTemplateContents()
Expand Down
26 changes: 26 additions & 0 deletions internal/printer/printer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,32 @@ func TestTemplate(t *testing.T) {
expectPrinted(t, "let x = `$}y{`", "let x = `$}y{`;\n")
expectPrinted(t, "let x = `\\${y}`", "let x = `\\${y}`;\n")
expectPrinted(t, "let x = `$\\{y}`", "let x = `\\${y}`;\n")

expectPrinted(t, "await tag`x`", "await tag`x`;\n")
expectPrinted(t, "await (tag`x`)", "await tag`x`;\n")
expectPrinted(t, "(await tag)`x`", "(await tag)`x`;\n")

expectPrinted(t, "await tag`${x}`", "await tag`${x}`;\n")
expectPrinted(t, "await (tag`${x}`)", "await tag`${x}`;\n")
expectPrinted(t, "(await tag)`${x}`", "(await tag)`${x}`;\n")

expectPrinted(t, "new tag`x`", "new tag`x`();\n")
expectPrinted(t, "new (tag`x`)", "new tag`x`();\n")
expectPrinted(t, "new tag()`x`", "new tag()`x`;\n")
expectPrinted(t, "(new tag)`x`", "new tag()`x`;\n")
expectPrintedMinify(t, "new tag`x`", "new tag`x`;")
expectPrintedMinify(t, "new (tag`x`)", "new tag`x`;")
expectPrintedMinify(t, "new tag()`x`", "new tag()`x`;")
expectPrintedMinify(t, "(new tag)`x`", "new tag()`x`;")

expectPrinted(t, "new tag`${x}`", "new tag`${x}`();\n")
expectPrinted(t, "new (tag`${x}`)", "new tag`${x}`();\n")
expectPrinted(t, "new tag()`${x}`", "new tag()`${x}`;\n")
expectPrinted(t, "(new tag)`${x}`", "new tag()`${x}`;\n")
expectPrintedMinify(t, "new tag`${x}`", "new tag`${x}`;")
expectPrintedMinify(t, "new (tag`${x}`)", "new tag`${x}`;")
expectPrintedMinify(t, "new tag()`${x}`", "new tag()`${x}`;")
expectPrintedMinify(t, "(new tag)`${x}`", "new tag()`${x}`;")
}

func TestObject(t *testing.T) {
Expand Down

0 comments on commit 1be8af4

Please sign in to comment.