From 228429c7bb069c9e7dbf36b50a0281d604145644 Mon Sep 17 00:00:00 2001 From: Arend van Beelen jr Date: Tue, 6 Apr 2021 08:22:05 +0200 Subject: [PATCH] fix(node-swc): Fix handling of tagged template expressions in Visitor (#1544) --- node-swc/__tests__/transform/plugin_test.js | 3 +++ node-swc/src/Visitor.ts | 5 ++++- node-swc/src/types.ts | 14 +++++++------- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/node-swc/__tests__/transform/plugin_test.js b/node-swc/__tests__/transform/plugin_test.js index 2845143ad00..fc239473eed 100644 --- a/node-swc/__tests__/transform/plugin_test.js +++ b/node-swc/__tests__/transform/plugin_test.js @@ -83,6 +83,9 @@ const Visitor = require("../../../Visitor").default; call(...foo); call(foo); + // Verify that visitor can handle tagged template expressions. + css\`color: red\`; + let arr = [elem, , ...foo]; module.exports = { diff --git a/node-swc/src/Visitor.ts b/node-swc/src/Visitor.ts index 7efd30b6f7a..47e06fc91d6 100644 --- a/node-swc/src/Visitor.ts +++ b/node-swc/src/Visitor.ts @@ -1156,7 +1156,10 @@ export default class Visitor { visitTaggedTemplateExpression(n: TaggedTemplateExpression): Expression { n.tag = this.visitExpression(n.tag); - n.expressions = n.expressions.map(this.visitExpression.bind(this)); + const template = this.visitTemplateLiteral(n.template); + if (template.type === "TemplateLiteral") { + n.template = template; + } return n; } diff --git a/node-swc/src/types.ts b/node-swc/src/types.ts index 47424f9197f..8851a3fffc9 100644 --- a/node-swc/src/types.ts +++ b/node-swc/src/types.ts @@ -957,21 +957,21 @@ export interface AwaitExpression extends ExpressionBase { argument: Expression; } -export interface TplBase { +export interface TemplateLiteral extends ExpressionBase { + type: "TemplateLiteral"; + expressions: Expression[]; quasis: TemplateElement[]; } -export interface TemplateLiteral extends ExpressionBase, TplBase { - type: "TemplateLiteral"; -} - -export interface TaggedTemplateExpression extends ExpressionBase, TplBase { +export interface TaggedTemplateExpression extends ExpressionBase { type: "TaggedTemplateExpression"; tag: Expression; + template: TemplateLiteral; + typeParameters: TsTypeParameterInstantiation; } @@ -1272,7 +1272,7 @@ export interface ImportNamespaceSpecifier extends Node, HasSpan { export interface NamedImportSpecifier extends Node, HasSpan { type: "ImportSpecifier"; local: Identifier; - imported: Identifier; + imported: Identifier | null; } export type ExportSpecifier =