首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将TemplateLiteral节点转换回模板字符串源码?

如何将TemplateLiteral节点转换回模板字符串源码?
EN

Stack Overflow用户
提问于 2021-11-18 16:15:17
回答 1查看 80关注 0票数 0

因此,我正在通过"normalizing" a JS AST以特定的方式工作,以便更容易地将代码转换为特定的目标语言。所以我必须了解AST的内部细节。然后为了测试,我使用print functions将它转换回JS源代码。到目前为止,我几乎处理过每一个案例,但TemplateLiteral似乎是一个奇怪的结构。

例如,您具有以下模板字符串:

代码语言:javascript
复制
const str = 'const b83 = `foo${a100} bar ${b82}`'

将该str解析为一个AST,您会得到以下结构:

代码语言:javascript
复制
{
  "type": "TemplateLiteral",
  "start": 2692,
  "end": 2715,
  "expressions": [
    {
      "type": "Identifier",
      "start": 2698,
      "end": 2702,
      "name": "a100"
    },
    {
      "type": "Identifier",
      "start": 2710,
      "end": 2713,
      "name": "b82"
    }
  ],
  "quasis": [
    {
      "type": "TemplateElement",
      "start": 2693,
      "end": 2696,
      "value": {
        "raw": "foo",
        "cooked": "foo"
      },
      "tail": false
    },
    {
      "type": "TemplateElement",
      "start": 2703,
      "end": 2708,
      "value": {
        "raw": " bar ",
        "cooked": " bar "
      },
      "tail": false
    },
    {
      "type": "TemplateElement",
      "start": 2714,
      "end": 2714,
      "value": {
        "raw": "",
        "cooked": ""
      },
      "tail": true
    }
  ]
}

请注意,“expression”和"quasis“并不是交错的,它们被放入单独的数组中。我如何返回并正确地将它们放在正确的顺序中,以便重新生成模板字符串源代码?假设这个AST节点可能是一个更大的AST的一部分,并且树可能会被重写,所以您使用的关于开始和结束文本位置的任何信息都将只从相对的角度有用,而不是绝对的。我只是不太确定阅读开头和结尾以重新交错表达式和quasis的最佳方式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-18 18:10:57

你将永远拥有quasis.length == expressions.length+1。你只需要取第一个准,然后是第一个表达式,然后是下一个准,然后是下一个表达式,依此类推,直到最后一个准。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70023238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档