如何使用astq查询Acorn AST中TemplateElement的raw/cooked属性?
问题:如何用ASTQ查询TemplateElement的value.raw/cooked属性
目标代码:
const t = 'template'; const s = `I'm a ${t}`;
Acorn解析后模板字面量的AST结构:
{ "type": "TemplateLiteral", "start": 32, "end": 53, "expressions": [ { "type": "Identifier", "start": 50, "end": 51, "name": "t" } ], "quasis": [ { "type": "TemplateElement", "start": 33, "end": 48, "value": { "raw": "I'm a ", "cooked": "I'm a " }, "tail": false }, { "type": "TemplateElement", "start": 52, "end": 52, "value": { "raw": "", "cooked": "" }, "tail": true } ] }
需求:通过TemplateElement的value.raw或value.cooked属性进行查询,但嵌套的value节点没有type属性,不知如何定位。
解决方案
ASTQ支持直接访问对象属性,无需依赖type字段,你可以通过链式属性访问定位到value.raw或value.cooked。以下是几种常见查询场景:
1. 查询所有非空raw值的TemplateElement
// 匹配所有raw值不为空的TemplateElement节点 .TemplateLiteral > .quasis[] > .TemplateElement[value.raw != '']
2. 精准匹配指定raw值的节点
// 匹配raw值为"I'm a "的TemplateElement节点 .TemplateLiteral > .quasis[] > .TemplateElement[value.raw = "I'm a "]
3. 基于cooked属性的模糊查询
如果需要针对cooked属性筛选,语法逻辑一致:
// 匹配cooked值包含"a "的节点 .TemplateLiteral > .quasis[] > .TemplateElement[value.cooked like "%a "]
语法说明
.TemplateLiteral:定位到模板字面量根节点> .quasis[]:遍历节点的quasis数组子项> .TemplateElement:筛选出类型为TemplateElement的子节点[value.raw = "xxx"]:通过方括号条件直接访问嵌套属性,设置匹配规则
内容的提问来源于stack exchange,提问作者Verbal_Kint
相关产品推荐
相关产品推荐

