AST

发布时间 2023-03-22 21:09:22作者: 噬蛇之牙

概述

estree 标准的 ast

  • VariableDeclaration:一个变量声明,例如 var x = 1 或 let y = 2

  • VariableDeclarator: 选择所有变量声明符节点,例如var x = 1或let y = 2。它是 VariableDeclaration 的子节点,用于指定变量的名称和初始值,例如 x = 1 或 y = 2

  • ConditionalExpression: 选择所有条件表达式节点,例如a ? b : c

  • LogicalExpression: 选择所有逻辑表达式节点,例如a && b或c || d

  • BinaryExpression: 选择所有二元表达式节点,例如a + b或c * d

    • [operator='>'] 应该是指操作符,属性选择器的使用
  • AssignmentPattern: 用于表示默认参数或解构赋值的语法,例如[x, y] = [1, 2]或{a, b} =

  • AssignmentExpression: 选择所有赋值表达式节点,例如a = b或c += d

  • UpdateExpression: 选择所有更新表达式节点,例如a++或–b

  • UnaryExpression: 选择所有一元表达式节点

  • ExpressionStatement 表达式语句

  • RestElement:表示函数参数或数组解构中使用...运算符来收集剩余元素的节点

  • SpreadElement:表示数组或函数调用中使用...运算符来展开可迭代对象的元素的节点

  • SpreadProperty:表示对象字面量中使用...运算符来复制其他对象属性的节点

    • ExperimentalSpreadProperty:与SpreadProperty相同,但是使用了新版Babel解析器
  • SequenceExpression:表示一系列逗号分隔的表达式,它们按顺序求值,并返回最后一个表达式的值。for循环的参数

  • AwaitExpression: 选择所有await表达式节点

  • YieldExpression: 选择所有yield表达式节点

  • NewExpression: 选择所有new表达式节点

  • ImportDeclaration 一个静态导入声明,例如 import foo from “mod”

  • ImportExpression 一个动态导入表达式,例如 import(“mod”)

  • ImportSpecifier:一个导入模块成员的绑定,例如 {foo} 在 import {foo} from “mod”

  • ImportNamespaceSpecifier:一个导入模块命名空间的绑定,例如 * as foo 在 import * as foo from “mod”。

  • ExportNamedDeclaration 一个导出命名值的声明,例如 export {foo, bar} 或 export function foo() {}

  • ExportDefaultDeclaration 一个导出默认值的声明,例如 export default foo

  • ExportSpecifier:一个导出模块成员的绑定,例如 {foo} 在 export

  • ExportAllDeclaration:一个导出所有模块成员的声明,例如 export * from “mod”

  • DoWhileStatement do-while语句

  • WhileStatement:表示一个while循环,它在一个条件为真时重复执行一个语句块

  • ForInStatement for-in语句

  • ForOfStatement for-of语句

  • ForStatement for语句

    • .test: 匹配一个具有test属性的节点,属性选择器
    • ForStatement > .test选择器可以匹配for循环语句中的条件部分,即for()中的第二个
  • MethodDefinition if语句

  • IfStatement是一个表示if-else语句的AST节点

  • ReturnStatement

  • SwitchCase 表示一个case子句,它包含一个测试值和一个语句序列

  • SwitchStatement:表示一个switch语句,它根据一个表达式的值匹配不同的case子句,并执行相应的语句块

  • ThrowStatement:表示一个throw语句,它抛出一个异常

  • BreakStatement break语句

  • ContinueStatement

  • TryStatement

  • WithStatement:表示一个with语句,它将一个对象添加到作用域链上,并在该对象上下文中执行一个语句块

    • with语句是一种JavaScript语句,它用来指定一个默认对象,以便在访问该对象的属性时可以省略对象名
  • DebuggerStatement:一个 debugger 语句,用于调试代码

  • CatchClause是ast中的一种节点类型,它表示一个捕获异常的语句块,通常与try和finally一起使用

  • LabeledStatement是ast中的一种节点类型,它表示一个带有标签的语句,例如while或switch。

  • Program(node){ }:节点是一个AST的根节点,它表示整个源代码的结构。

  • PropertyDefinition(node) { }:只匹配有子节点的属性定义节点,属性定义节点是指变量定义、函数定义等

  • Identifier是一种AST节点的类型,用来表示标识符,比f如变量名,函数名,模块名等

    • Identifier.key 表示标识符的名称,返回一个字符串,作为选择器应该是表示有标识符
    • .就是用来访问该节点的属性
  • MetaProperty是一种表示元属性的AST节点类型,比如new.target或import.meta

  • Property(node):节点是一个表示对象字面量中的属性的AST节点。

  • ObjectExpression(node):一个表示对象字面量

  • ObjectPattern 表示对象解构模式 var {x, y} = obj

  • ArrayExpression是一种AST节点的类型,用来表示数组表达式

  • ArrayPattern 数组解构模式

  • MemberExpression 成员表达式,obj.x arr[0]

    • [computed=true]是一种AST节点的属性,用来表示成员表达式中的属性名是否是通过计算得到的,数组的key或者以变量为key的属性名就是通过计算得到的
  • BlockStatement是一个表示一组语句的节点,它可以出现在函数体、if语句、while语句等地方。即一个作用域内的全部语句

  • FunctionDeclaration是一个表示函数声明的抽象语法树节点。

    • FunctionDeclaration:exit 不是 esquery 提供的选择器,是 eslint 独有的
  • FunctionExpression是一个表示函数表达式的抽象语法树节点,可以是匿名函数

  • ArrowFunctionExpression(node)是一个表示箭头函数表达式的抽象语法树节点

  • ThisExpression是一个表示this表达式的抽象语法树节点

  • Super 构造函数中的

  • CallExpression 函数调用表达式foo(1, 2)

  • ClassDeclaration:表示一个类声明,它定义了一个类名和一个类体

  • ClassExpression:表示一个类表达式,它定义了一个匿名或命名的类,并返回该类作为值

  • ClassBody是一个表示类定义中的方法和属性的节点,它包含一个ClassMethod或ClassProperty的数组。

  • StaticBlock:一个静态代码块,在类中定义静态属性或方法

  • PrivateIdentifier是ast中的一种节点类型,它表示一个私有标识符,例如私有类元素。即类的私有属性只允许类内部访问

  • Literal:普通字符串

  • TemplateLiteral:模板字符串

  • TemplateElement(node) { }: 标签

  • .init是一种AST节点的属性,用来表示初始化的值,比如变量声明或者解构模式中的赋值。 var x = 10; var [x = 1, y = 2] = arr;

  • ['VariableDeclaration','FunctionDeclaration'] {} ESLint 规则的回调函数可以使用数组字面量的语法来指定多个 ast 节点类型作为参数,这意味着该回调函数会在遇到任何一个指定类型的节点时被触发,应该是 eslint 专有的

eslint-plugin-vue 中的 utils

  • utils.defineTemplateBodyVisitor 用来生成 vue 中 template 和 script 标签下选择器的工具,接受4个参数

    • context
    • templateBodyVisitor
      • VForExpression
    • scriptVisitor
    • options
      • 目前只支持一个选项,即templateBodyTriggerSelector,是 templateBodyVisitor 内选择器的前置过滤条件,只有匹配了templateBodyTriggerSelector后才会判断是否匹配 templateBodyVisitor 内的选择器
  • utils.defineDocumentVisitor 用来定义文档访问器的函数,它可以让你在<template>和<script>标签中使用ESLint规则,和 defineTemplateBodyVisitor 区别在于它遍历 style 节点

    • context,
    • documentVisitor,
    • options
  • utils.defineVueVisitor 用于定义一个访问者对象,可以在不同的Vue组件节点上执行不同的规则函数

    • context
    • visitor
      • onVueObjectEnter ... Event when Vue Object is found.
      • onVueObjectExit ... Event when Vue Object visit ends.
      • onSetupFunctionEnter ... Event when setup function found.
      • onRenderFunctionEnter ... Event when render function found.
  • utils.executeOnVue 用于在Vue实例上执行给定的回调函数,并获取其属性和方法

  • utils.isScriptSetup

  • utils.getVueComponentDefinitionType 用于在eslint-plugin-vue中获取一个节点的Vue组件定义类型,类型包括如下

    • ‘mark’:表示节点是一个Vue组件的标记,比如<script setup>或者<template functional>
    • ‘export’:表示节点是一个Vue组件的导出,比如export default
    • ‘definition’:表示节点是一个Vue组件的定义,比如Vue.component('my-component', { ... })或者defineComponent({ ... })
    • ‘unknown’:表示节点不是一个Vue组件的定义类型,或者无法识别
  • utils.getStaticPropertyName 获取一个属性节点的静态名称,即一个对象的常量key的名称,非常量的话返回undefined

  • utils.findAssignmentProperty是一个工具函数,用于在AST节点中查找赋值属性。

    • 赋值属性是一种解构赋值的语法,用于从一个对象或数组中提取属性或元素,并赋值给一个变量或对象的属性const { a, b } = { a: 1, b: 2 };
  • indentCommon.defineVisitor是一个函数,它用于在eslint-plugin-vue中定义自定义的缩进规则。

    • indentCommon 位于 require('../utils/indent-common')

eslint-plugin-vue 中的 ast

  • VAttribute 表示.vue文件中